【问题标题】:create an infinite loop to build a REPL in scheme创建一个无限循环以在方案中构建一个 REPL
【发布时间】:2017-11-13 19:08:57
【问题描述】:

我觉得很漂亮,我如何在 Common Lisp 中创建一个 REPL:

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

但是,由于我在 Lisp(和方言)方面完全是个菜鸟,由于缺少 loop 函数,我在 Scheme 中未能实现同样的目标。 我尝试将其实现为

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

但这似乎没有任何作用(即使被称为(loop (print 'foo))

那么问题来了:如何在Scheme中实现无限循环?

【问题讨论】:

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


    【解决方案1】:
    (define (loop x) 
      x 
      (loop x))
    

    当你调用它时这是一个无限循环。但它不会擦除、评估或打印。它接受一个参数x,评估它,然后在用相同的参数调用自身之前将其丢弃并重复。

    对于 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))))
    

    【讨论】:

    • 我的实现尝试只针对loop 本身,所以我可以像在CL 中一样使用(loop (print (eval (read))))。我仍然不明白为什么它不起作用。 otoh,递归 (repl) 也让我觉得非常好......
    猜你喜欢
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2023-02-17
    • 2021-09-17
    相关资源
    最近更新 更多