0

在 Chez Scheme REPL 中,是否可以得到之前的结果?例如在 ruby​​ 的 irb repl 中,可以使用下划线。

例如,我可以执行以下操作吗?

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

得到6?

4

1 回答 1

1

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现在是一个函数,它接受一个表达式,对其进行评估,将非空结果存储到$NN 单调递增形式的 ids 中,然后打印出结果。new-cafe是一个标准的 chez 函数,用于管理 REPL 的读取、打印和循环部分。它需要一个管理评估部分的功能。在这种情况下,repl还需要管理打印,因为它显示与值关联的 id。

编辑:

我找到了一种更好的方法来做到这一点。我们可以只自定义打印机,而不是自定义 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
于 2019-01-02T17:18:17.403 回答