我正在尝试使用已经在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中,则它已经可以工作了。一遍又一遍地粘贴很多代码对于交互式开发来说根本不是一件好事。
可以帮忙吗? 您是否对我的问题有任何建议,或者您通常如何应对?
谢谢。
答案 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-j
。 c-u
修饰符与软件包的行为略有不同:
注意:此行为特定于SLIME,不一定是其他环境的行为。
答案 1 :(得分:4)
它不是那样工作的。 in-package
格式是供读者使用的指令,因此可以在该包中读取缓冲区中的 格式。实际上,当您进行C-c C-c
(slime-compile-defun)操作时,它将查找前面的in-package
形式,而不管它是经过评估还是以某种方式进行编译。
否则,这将是导致混淆的错误的根源,因为由于交互顺序的某些更改,您可能(并且经常)会意外地编译错误的程序包中的内容。
要在REPL中切换软件包,可以执行in-package
形式 ,也可以使用缓冲区中的SLIME快捷方式C-c ~
(切换当前目录。)