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-jc-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 身份验证和令牌刷新流程

SLIME 和 SWANK 在 MIPS 架构上失败

将文件从 angular ionic 上传到本地主机中的 slim php 框架

使用Slim将变量从内容传递到Nanoc中的布局

将整个 Slim 应用程序打包到 Phar 文件中时出错

将变量插入到从不同目录声明的 .html.slim 文件中