一般来说,答案是“不要”。您应该使用 REPL 的方式是评估对它的零碎更改,然后评估一两个函数以确保一切按预期进行。这种方法的一部分是构建您的程序,以便可以轻松地对其进行分段测试,这意味着不会自动启动任何无限循环。在您询问的特定情况下,您可以改为写
(define (do-stuff)
(print "Ciao"))
(define (main-loop)
(do-stuff)
(rest 1)
(main-loop))
(define (start) (main-loop))
您现在可以逐步开发do-stuff
,定期评估您的解释器的新版本并调用它们以确保它们工作,然后start
在您确信它正在做正确的事情时最终调用。
你可能会从这个关于 Common Lisp的类似问题中得到启发。
顺便说一句,如果您使用的是 Common Lisp 和 SLIME,您现在可以或多或少地按照您的建议进行操作:
(defun do-stuff ()
(format t "Ciao~%"))
(defun main-loop ()
(loop (progn (do-stuff)
(sleep 1))))
(main-loop)
启动它会开始Ciao
在你的 SLIME REPL 中的不同行上打印。如果你do-stuff
改为
(defun do-stuff ()
(format t "else~%"))
然后用C-c C-c
(默认绑定slime-compile-defun
)点击它,你会看到你的 SLIME REPL 开始打印else
飞行中的行。
CL-USER> (main-loop)
Ciao
Ciao
Ciao
; compiling (DEFUN DO-STUFF ...)else
else
else
else
else
else
; Evaluation aborted on NIL. User break.
CL-USER>
我不确定如何在 Scheme 中完成同样的事情,但我有理由相信这是可能的。
话虽如此,您有时想要运行一个程序,其中一部分是无限的loop
。一个真实的例子是在测试某种 TCP 服务器时。如果您处于这种情况,并且您想要的工作流程是
- 写文件
- 跑
csi my-file.scm
- 编辑文件
- 杀
csi
- 跑
csi my-file.scm
goto 3
而且您基本上只想自动化步骤 4 到 6,您需要一个外部工具来为您完成。看一下entr
or hsandbox
(后者没有开箱即用的 Scheme 支持,但看起来并不难添加)。