这让我非常漂亮,我可以使用以下方法在Common Lisp中创建一个REPL:
(loop (print (eval (read))))
然而,由于我是Lisp(和方言)中的一个完整的菜鸟,由于缺少loop
功能,我在Scheme中很难达到相同的效果。
我试图将其实现为
(define (loop x) x (loop x))
但这似乎没有做任何事情(即使被称为(loop (print 'foo))
所以问题是:如何在Scheme中实现无限循环?
答案 0 :(得分:1)
(define (loop x)
x
(loop x))
调用它时,这是一个无限循环。但它没有erad,评估或打印。它接受一个参数x
,对它进行评估,然后在使用相同的参数进行callng之前抛弃它并重复它。
对于REPL,你想要这样的东西:
(define (repl)
(display (eval (read))) ; for side effect of printing only
(repl))
通常REPL有办法退出:
(define (repl)
(let ((in (read)))
(when (not (eq? in 'exit))
(print (eval in))
(repl))))