你能在Lisp上不使用REPL进行编程吗?

3

我刚拿到《Lisp之国》并开始做第一个程序。

我有几个问题。

是否有一种方法可以编写一些代码,并通过编译器或解释器运行它,而不使用REPL?我不太喜欢它。如果我搞砸了,似乎无法返回。它只是说“哈,你搞砸了,重新输入整个函数。”

我也想知道REPL的意义何在。


1
请查看函数compile-fileload。有关文档,请参见http://www.lispworks.com/documentation/HyperSpec/Front/Contents.htm。 - Terje D.
1个回答

19

非REPL工作流程

  1. 编辑您的文件
  2. 使用compile-file编译文件; 修复错误和警告; 重复执行。
  3. 使用load加载文件; 评估您想要的形式; 重复执行

示例

$ cat > f.lisp <<EOF
(defun f (x) (if (zerop x) 1 (* (f (1- x)) x)))
EOF
$ clisp -q -norc -c f.lisp
;; Compiling file /home/sds/f.lisp ...
;; Wrote file /home/sds/f.fas
0 errors, 0 warnings
$ clisp -q -norc -i f.fas -x '(f 10)'
;; Loading file f.fas ...
;; Loaded file f.fas
3628800
$ 

正确的方式

使用一个集成开发环境(IDE),例如 Emacs with SLIME

这样,您可以在支持自动缩进并为每个标准符号显示帮助的编辑器中编辑代码。

您编写函数后立即进行编译和测试,从而使开发周期非常短。在幕后,这是通过IDE与REPL交互来完成的(这回答了您的最后一个问题)。

什么是REPL?

读取-求值-打印循环是编辑-编译-运行循环的更快、更通用的版本。

与整个程序操作不同(编译速度较慢,执行过程繁琐,难以导航到特定的测试位置),您按照正在处理的特定函数进行操作。

例如,在 gdb 中,您可以使用 print my_func(123) 执行一个函数,但如果您更改了 my_func,则必须重新编译文件、重新链接整个可执行文件,然后重新加载它到 gdb 中,并重新启动进程。

通过Lisp风格的REPL,您只需要重新eval(defun my-func ...),然后在提示符下可以执行(my-func 123)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接