Chez Scheme не имеет встроенного способа сделать это, но, будучи схемой, мы можем свернуть нашу собственную:
(define repl
(let ([n 1])
(lambda (expr)
(let-values ([vals (eval expr)])
(for-each (lambda (v)
(unless (eq? (void) v)
(let ([sym (string->symbol (format "$~a" n))])
(set! n (+ n 1))
(printf "~a = " sym)
(pretty-print v)
(set-top-level-value! sym v))))
vals)))))
(new-cafe repl)
repl
теперь функция, которая принимает выражение,оценивает его, сохраняет не пустые результаты в идентификаторы вида $N
, где N монотонно увеличивается, и распечатывает результаты.new-cafe
- это стандартная функция chez, которая управляет чтением, печатью и зацикливанием частей REPL.Требуется функция, которая управляет оценочной частью.В этом случае repl
также необходимо управлять печатью, поскольку она показывает идентификаторы, связанные со значениями.
Редактировать:
Я нашел немного лучший способ сделать это.Вместо того, чтобы иметь собственный repl, мы можем настроить только принтер.Теперь эта функция больше не отвечает за оценку входных данных.
(define write-and-store
(let ([n 1])
(lambda (x)
(unless (eq? (void) x)
(let ([sym (string->symbol (format "$~a" n))])
(set! n (+ n 1))
(set-top-level-value! sym x)
(printf "~a = " sym)
(pretty-print x)
(flush-output-port (console-output-port)))))))
(waiter-write write-and-store)
Простой пример использования:
> (values 1 2 3 4)
$1 = 1
$2 = 2
$3 = 3
$4 = 4
> (+ $1 $2 $3 $4)
$5 = 10