SLIME 交互式开发 - 将代码粘贴到 SLIME REPL 中!= eval 来自缓冲区的命令
Posted
技术标签:
【中文标题】SLIME 交互式开发 - 将代码粘贴到 SLIME REPL 中!= eval 来自缓冲区的命令【英文标题】:SLIME interactive development - paste code into SLIME REPL != eval commands from buffer 【发布时间】:2019-09-29 01:54:06 【问题描述】:我正在尝试使用我已经在 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 中,它已经可以工作了。尽管对于交互式开发来说,一遍又一遍地粘贴大量代码并不是一件好事。
你能帮忙吗? 你对我的错误有什么建议吗?或者你通常如何处理这个问题?
谢谢。
【问题讨论】:
确保您阅读了已接受的答案和 Rainer Joswig 的答案!他们一起帮助我更好地理解了这个主题。 【参考方案1】:Slime:来自缓冲区的代码通常不会在 repl 中评估
我只想通过执行 M-x slime-eval-buffer 将整个缓冲区运行到 SLIME REPL 中
该模型不是从源缓冲区“在 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 特有的,不一定是其他环境的行为。
【讨论】:
谢谢雷纳!这种功能的存在很有意义,我什至不知道它的存在。谢谢!我希望我能给两个人提供公认的答案,因为你们都给了我关于这个主题的非常独特和有用的见解。【参考方案2】:它不是那样工作的。 in-package
表单是给读者的指令,以便在该包中读取之后的表单缓冲区。事实上,当你执行C-c C-c
(slime-compile-defun) 时,它会寻找前面的in-package
形式,无论它是否被评估或以某种方式编译。
否则,这将成为令人困惑的错误的来源,因为您可能(并且经常会)由于某些更改的交互顺序而意外地将内容编译到错误的包中。
为了在REPL中切换包,你可以在那里执行in-package
表单,或者你可以使用缓冲区中的SLIME快捷方式C-c ~
(也可以切换当前目录) )。
【讨论】:
哇!没想到!惊人的!!!在粘液中进行这种 eval 时,是否还有其他特殊的命令需要注意?还是只是在包装内?你从哪里学来的所有这些东西?由于在线资源太少,似乎很难获得更多关于 Lisp 的知识。谢谢!以上是关于SLIME 交互式开发 - 将代码粘贴到 SLIME REPL 中!= eval 来自缓冲区的命令的主要内容,如果未能解决你的问题,请参考以下文章
Angularjs 和 slim 框架 JWT 身份验证和令牌刷新流程