【问题标题】:Emacs slime management, user input and multi eval and printEmacs slime 管理、用户输入和多重评估和打印
【发布时间】:2019-10-19 14:00:05
【问题描述】:

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

目前我在一个窗口中有一个处于 slime 模式的缓冲区,而另一个窗口中有 slime-description。

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

但是当我尝试对这条线做同样的事情时

(defvar *name* (read))

用用户输入设置 name 变量,什么都没有发生。

为什么?

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

【问题讨论】:

标签: emacs lisp slime


【解决方案1】:

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

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

但是,您几乎从不希望您正在编译或加载的文件包含导致在编译或加载时调用 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 说比这更糟糕的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    相关资源
    最近更新 更多