Common lisp 如何在sbcl中使用实时代码功能?

Common lisp 如何在sbcl中使用实时代码功能?,common-lisp,read-eval-print-loop,sbcl,Common Lisp,Read Eval Print Loop,Sbcl,我正在尝试用lisp进行实时编码。我有一个文件t.cl,它只包含这一行:loopwrite-21。现在,当我在bash中使用sbcl-load t.cl-eval'quit'运行文件时,它会运行该行,但是当我尝试在另一个终端中编辑文件并在运行时保存它时,没有任何变化。为什么您的示例失败 在shell中运行sbcl-load t.cl-eval'quit'时,它所做的是在进程中旋转一个sbcl Lisp映像,编译文件并运行它。然后修改文件并将其保存到磁盘。最后一个操作与已经运行的SBCL进程无关,

我正在尝试用lisp进行实时编码。我有一个文件t.cl,它只包含这一行:loopwrite-21。现在,当我在bash中使用sbcl-load t.cl-eval'quit'运行文件时,它会运行该行,但是当我尝试在另一个终端中编辑文件并在运行时保存它时,没有任何变化。

为什么您的示例失败 在shell中运行sbcl-load t.cl-eval'quit'时,它所做的是在进程中旋转一个sbcl Lisp映像,编译文件并运行它。然后修改文件并将其保存到磁盘。最后一个操作与已经运行的SBCL进程无关,该进程已经编译了上一个文件。SBCL在您要求它读取文件时读取一次,一旦它有编译的指令要运行,它就没有理由再次查看该文件,除非您明确要求它

Emacs+SLIME的“实时”示例 为了对正在运行的程序执行“实时”更改,必须与已经运行的Lisp映像交互。使用Emacs+Slime很容易做到这一点。例如,您可以有这样一个循环:

德芬福x+x 3 时间是20点吗 格式t~A~%foo it 睡眠1 然后在REPL中执行期间使用新定义重新编译foo:

德芬福x+x 100 另一个线程将用于重新编译函数。一旦编译完成,新函数将用于将来的调用。 REPL中的输出如下所示:

3
4
5
CL-USER> (defun foo (x) (+ x 100))
WARNING: redefining COMMON-LISP-USER::FOO in DEFUN
FOO
103
104
105
...
这也适用于从另一个文件编译foo的新定义,而不是直接输入REPL

从系统外壳工作
虽然您已经可以出于开发目的使用上面的示例,但是您可能希望与shell中正在运行的SBCL Lisp映像进行交互。我不知道该怎么做。对于您的确切示例,您希望让SBCL重新加载已修改的最终文件。简要介绍似乎没有提供将lisp代码传递到已在运行的SBCL进程的方法。

以下是如何使用Swank连接到正在运行的lisp映像:请参阅编辑器:以及如何连接到正在运行的lisp映像: