SLIME交互式开发-将代码从缓冲区粘贴到SLIME REPL!=评估命令

时间:2019-05-11 11:08:54

标签: package common-lisp evaluation slime asdf

我正在尝试使用已经在package.lisp中定义的asdf创建一个名为“ a”(要学习)的基本软件包,而我的主文件a.lisp的开头是:

(in-package :a)
...

如果我正在开发模块,我想通过执行 Mx slime-eval-buffer 之类的方法将整个缓冲区运行到SLIME REPL中,但是在此之后不会发生运行该命令,我仍然在cl-user软件包中:

;;; from a.lisp
A> (in-package :a)
#<PACKAGE "A">
CL-USER>     <--- should have stayed in A>

但是,如果我自己将整个代码粘贴到SLIME REPL中,则它已经可以工作了。一遍又一遍地粘贴很多代码对于交互式开发来说根本不是一件好事。

可以帮忙吗? 您是否对我的问题有任何建议,或者您通常如何应对?

谢谢。

2 个答案:

答案 0 :(得分:6)

史莱姆:通常不会在repl

中评估缓冲区的代码
  

我只想通过执行M-x slime-eval-buffer将整个缓冲区评估为SLIME REPL

该模型不是一种从源缓冲区“评估SLIME REPL”的模型。一个评估连接的Lisp中的代码。连接的Lisp可能会为每个评估请求生成一个线程。

例如,您可以看到在评估缓冲区之后,常规的REPL变量(如*(最后的结果)不会得到更新。

将代码粘贴到REPL缓冲区中时,您将从那里执行代码,并在REPL中执行代码。

史莱姆:实际上是从REPL中的缓冲区进行评估

您可以将Lisp缓冲区中的代码评估为REPL。请参阅命令c-u m-x slime-eval-last-expression-in-repl或更短的c-u c-c c-jc-u修饰符与软件包的行为略有不同:

  1. 切换到REPL缓冲区
  2. 切换到源缓冲区包
  3. 评估REPL中的源代码(包括设置REPL变量)
  4. 将结果打印到REPL缓冲区中(包括设置REPL变量)
  5. 请勿将REPL切换回其早期版本

注意:此行为特定于SLIME,不一定是其他环境的行为。

答案 1 :(得分:4)

它不是那样工作的。 in-package格式是供读者使用的指令,因此可以在该包中读取缓冲区中的 格式。实际上,当您进行C-c C-c(slime-compile-defun)操作时,它将查找前面的in-package形式,而不管它是经过评估还是以某种方式进行编译。

否则,这将是导致混淆的错误的根源,因为由于交互顺序的某些更改,您可能(并且经常)会意外地编译错误的程序包中的内容。

要在REPL中切换软件包,可以执行in-package形式 ,也可以使用缓冲区中的SLIME快捷方式C-c ~(切换当前目录。)