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-j
。 c-u
修饰符导致包的行为略有不同:
- 切换到 REPL 缓冲区
- 切换到源缓冲包
- 评估 REPL 中的源代码(包括设置 REPL 变量)
- 在 REPL 缓冲区中打印结果(包括设置 REPL 变量)
- 不要将 REPL 切换回其早期的包
注意:此行为特定于 SLIME,不一定是其他环境的行为方式。
我正在尝试使用我已经在 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-j
。 c-u
修饰符导致包的行为略有不同:
- 切换到 REPL 缓冲区
- 切换到源缓冲包
- 评估 REPL 中的源代码(包括设置 REPL 变量)
- 在 REPL 缓冲区中打印结果(包括设置 REPL 变量)
- 不要将 REPL 切换回其早期的包
注意:此行为特定于 SLIME,不一定是其他环境的行为方式。