你可以在没有REPL的情况下编写Lisp程序吗?

时间:2013-03-29 18:08:45

标签: lisp common-lisp read-eval-print-loop land-of-lisp

所以我得到了Land of Lisp并开始做第一个程序。 我有几个问题。

有没有办法只编写一些代码并通过编译器或解释器运行它,而不是使用REPL的东西?我不喜欢它。如果我搞砸了,我似乎无法回去。它只是有点说“你搞砸了,重新输入整个功能。”

我也想知道REPL的重点是什么。

1 个答案:

答案 0 :(得分:18)

非REPL工作流程

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

    $ 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?

    Read-Eval-Print循环是Edit-Compile-Run循环的更快,更通用的版本。

    您可以根据您所使用的特定功能进行操作,而不是根据整个程序(可能编译速度慢,执行繁琐而无法导航到正在测试的特定位置)进行操作。

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

    使用Lisp风格的REPL,您需要做的就是重新eval (defun my-func ...),并且可以在提示时执行(my-func 123)