在Common Lisp中什么是印刷表示?

时间:2013-04-02 23:07:19

标签: emacs lisp read-eval-print-loop sbcl hunchentoot

我正在使用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中的实际对象。这是正确的吗?我想这一定是因为我在做。这对我来说真是太神奇了。

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

2 个答案:

答案 0 :(得分: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)>

答案 1 :(得分:6)

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

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

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

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