在 Chez Scheme REPL 中,是否可以得到之前的结果?例如在 ruby 的 irb repl 中,可以使用下划线。
例如,我可以执行以下操作吗?
> (+ 2 3)
5
> (+ 1 <something>)
得到6?
在 Chez Scheme REPL 中,是否可以得到之前的结果?例如在 ruby 的 irb repl 中,可以使用下划线。
例如,我可以执行以下操作吗?
> (+ 2 3)
5
> (+ 1 <something>)
得到6?
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 单调递增形式的 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