Emacs 粘液管理、用户输入和多重评估和打印

Emacs slime management, user input and multi eval and print

我在 ubuntu 19。 使用 emacs、slime 和 sbcl 练习一些 lisp。

目前我有一个缓冲区在粘液模式 window 和另一个 window.

的粘液描述

当我想执行一行时,我把它写在缓冲区上,然后按 C-c C-p。

但是当我尝试对

行做同样的事情时
(defvar *name* (read))

使用用户输入设置 name 变量,没有任何反应。

为什么?

另外我想执行整个脚本而不是一次执行一行,我该怎么做?

'Nothing is happening' 因为 read 正在等待您在 REPL 中输入内容。如果您查看 REPL,您会感到困惑,因为您正在评估的表单没有显示,所以您所看到的只是……什么都没有,但您需要在上面输入一些内容。此外,从您的描述中并不清楚您显示了哪些缓冲区,但我怀疑 REPL 不是其中之一,这会使事情变得更糟。

我不知道其他人如何使用 SLIME,但我所做的是至少拥有 REPL(在一个 window 中键入 M-x-slime 后得到的东西,以及一个文件我正在另一个项目中工作。然后您可以通过键入与 REPL 进行交互,并使用 C-M-x 或任何其他命令(特别是东西)将代码从文件发送到 运行 lisp像 C-c C-k 编译和加载文件。

但是您几乎从不想要您正在编译或加载的文件包含任何导致 read 在编译或加载时被调用的内容:结果是委婉地说,神秘一点:系统会在没有提示的情况下停止等待您输入内容。在 REPL 中这样做更有意义:

CL-USER> (defvar *name* (read))
(here is the data I am typing in)
*NAME*

事实上,即使您竭尽全力在正在加载的文件中对 read 进行非神秘调用,您也必须竭尽全力确保它们安全。考虑这个文件,toxin.lisp:

(defvar *my-thing*
  (progn
    (format *query-io* "~&thing? ")
    (finish-output *query-io*)
    (read *query-io*)))

现在:

$ lisp
[...]
(load "toxin" :verbose t)
;Loading #P"toxin"...
thing? #.(quit)

当然,我可以对 Lisp 说更糟糕的话。