SLIME 交互式开发 - 将代码粘贴到 SLIME REPL != 来自缓冲区的 eval 命令

SLIME interactive development - paste code into SLIME REPL != eval commands from buffer

我正在尝试使用我已经在 package.lisp 中定义的 asdf 创建一个名为 "a" 的基本包(用于学习),并且我的主文件 a.lisp 开始有:

(in-package :a)
...

如果我正在开发我的模块,我只想 运行 通过执行 M-x 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 中,它就已经可以运行了。尽管对于交互式开发而言,一遍又一遍地粘贴大量代码一点也不好。

你能帮忙吗? 你对我的错误有什么建议,或者你通常如何处理这个问题?

谢谢。

不是这样的。 in-package形式是对reader的指令,所以在那个包中读取buffer之后的形式。事实上,当您执行 C-c C-c (slime-compile-defun) 时,它会查找前面的 in-package 形式,而不管它是通过某种方式计算还是编译的。

否则,这将是造成混淆错误的根源,因为您可能(并且经常会)由于一些交互顺序的改变而意外地将东西编译到错误的包中。

为了在 REPL 中切换包,您可以在 那里 执行 in-package 形式,或者您可以使用 SLIME 快捷方式 C-c ~缓冲区(也切换当前目录)。

Slime:来自缓冲区的代码通常不会在 repl

中计算

I'd just like to run eval the whole buffer into the SLIME REPL by doing M-x slime-eval-buffer

该模型不是源缓冲区中的模型 'evaluates in the 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-jc-u 修饰符导致包的行为略有不同:

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

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