6

我正在使用 SBCL、emacs、slime 和 quicklisp 来安装各种软件包。

我像这样实例化并启动一个hunchentoot接受器,

CL-USER> (hunchentoot:start (make-instance 'hunchentoot:acceptor :port 4242))
#<HUNCHENTOOT:ACCEPTOR (host *, port 4242)>

我通过在端口 4242 上打开浏览器进行测试,它工作正常。

然后要停止它,我可以复制打印的表示并发出命令,如下所示:

CL-USER> (hunchentoot:stop #<HUNCHENTOOT:ACCEPTOR (host *, port 4242)>)
#<HUNCHENTOOT:ACCEPTOR (host *, port 4242)>

这仅适用于相应开始返回的打印表示。

这让我很惊讶。我认为打印的表示只是返回的文本,大概是因为对象本身无法显示。因此,我认为 hunchentoot:stop 可以使用文本字符串来查找对象非常简洁。但是经过更多的实验,我注意到我必须使用与开头相对应的打印表示,而不仅仅是任何一个。我还注意到,当我将鼠标放在打印的表示上时,它会突出显示整个片段。所以它根本不是文本,而是实际在 REPL 中的对象,我可以使用它。

因此,一方面返回的是打印表示,因此我可以看到它,但另一方面它是我可以在 REPL 中复制和粘贴的实际对象。这是正确的吗?我想这一定是因为我正在这样做。这对我来说太棒了。

任何解释或见解将不胜感激。

4

2 回答 2

7

这就是 SLIME 的“魔法”。事实上,你不能在 Lisp 中用这种“打印表示”做任何事情,因为它被认为是一个不可读的对象:在你的实现的控制台模式下尝试它。但是 SLIME 会记住与实际对象的关联,所以它会用对象代替那个#<...>东西——有点像 Lisp 机器......

什么会正常工作并且总是这样:

CL-USER> (defvar *server* (hunchentoot:start (make-instance 'hunchentoot:easy-acceptor :port 4242)))
*server*
CL-USER> (hunchentoot:stop *server*)
#<HUNCHENTOOT:ACCEPTOR (host *, port 4242)>
于 2013-04-02T23:17:08.117 回答
6

这些就是所谓的“演示文稿”。请参阅 SLIME 用户手册,演示文稿

该文档还解释了如果对象不消失会发生什么......

这个想法主要来自 BBN (Zdybel, et al., An Information Presentation System, 1981),然后是 Symbolics Lisp Machine 和可移植的Common Lisp Interface Manager,后者在其窗口系统中记录输出过程中的底层对象。这些演示文稿用于图形和文本输出,是其用户界面的重要基础。

SLIME 已经接受了它的 REPL 的想法。

于 2013-04-03T07:29:04.707 回答