创建一个无限循环来在方案中构建REPL

时间:2017-11-13 19:08:57

标签: scheme infinite-loop read-eval-print-loop

这让我非常漂亮,我可以使用以下方法在Common Lisp中创建一个REPL:

 (loop (print (eval (read))))

然而,由于我是Lisp(和方言)中的一个完整的菜鸟,由于缺少loop功能,我在Scheme中很难达到相同的效果。 我试图将其实现为

(define (loop x) x (loop x))

但这似乎没有做任何事情(即使被称为(loop (print 'foo))

所以问题是:如何在Scheme中实现无限循环?

1 个答案:

答案 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))))