我正在尝试使用 asdf 创建一个名为“a”(学习)的基本包,我已经在 package.lisp 中定义了该包,我的主文件 a.lisp 开头为:
(in-package :a)
...
如果我正在开发我的模块,我只想通过执行 M-x slime-eval-buffer 或其他操作来将整个缓冲区运行 eval 到 SLIME REPL 中,但这不会发生,之后运行该命令我仍在 cl-user 包中:
;;; from a.lisp
A> (in-package :a)
#<PACKAGE "A">
CL-USER> <--- should have stayed in A>
但是,如果我自己将整个代码粘贴到 SLIME REPL 中,它就已经可以工作了。尽管对于交互式开发来说,一遍又一遍地粘贴大量代码根本不是一件好事。
你能帮忙吗? 您对我的错误有什么建议吗?或者您通常如何应对这个问题?
谢谢。
最佳答案
Slime:缓冲区中的代码通常不会在 repl 中进行计算
I'd just like to run eval the whole buffer into the SLIME REPL by doing M-x slime-eval-buffer
该模型不是从源缓冲区“在 SLIME REPL 中进行评估”。人们评估连接的 Lisp 中的代码。这个连接的 Lisp 可能会为每个评估请求生成一个线程。
例如,您可以看到,在评估缓冲区后,通常的 REPL 变量如 *
(最后的结果)不会更新。
当您将代码粘贴到 REPL 缓冲区中时,您可以从那里执行,并且它会执行 REPL 中的代码。
Slime:实际上是从 REPL 中的缓冲区进行计算
您可以将 Lisp 缓冲区中的代码评估到 REPL 中。请参阅命令 c-u m-x slime-eval-last-expression-in-repl
或更短的 c-u c-c c-j
。 c-u
修饰符导致包的行为略有不同:
- 切换到 REPL 缓冲区
- 切换到源缓冲包
- 评估 REPL 中的源代码(包括设置 REPL 变量)
- 打印 REPL 缓冲区中的结果(包括设置 REPL 变量)
- 不要将 REPL 切换回其早期的包
注意:此行为特定于 SLIME,并不一定是其他环境的行为。
关于package - SLIME 交互式开发 - 将代码粘贴到 SLIME REPL != 来自缓冲区的 eval 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56089733/