Предыдущий результат в Chez Scheme - PullRequest
0 голосов
/ 29 октября 2018

В Chel Scheme REPL возможно ли получить предыдущий результат?Например, в irb repl ruby ​​можно использовать подчеркивание.

Например, я могу сделать следующее?

> (+ 2 3)
5
> (+ 1 <something>)

И получить 6?

1 Ответ

0 голосов
/ 02 января 2019

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
...