Emacs 在Common Lisp中,什么是打印表示?

Emacs 在Common Lisp中,什么是打印表示?,emacs,lisp,read-eval-print-loop,sbcl,hunchentoot,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)> CL-USER>(hunchentoot:start(生成实例'hunchentoot:accep

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

我实例化并启动一个hunchentoot接受程序,如下所示

CL-USER> (hunchentoot:start (make-instance 'hunchentoot:acceptor :port 4242))
#<HUNCHENTOOT:ACCEPTOR (host *, port 4242)>
CL-USER>(hunchentoot:start(生成实例'hunchentoot:acceptor:port 4242))
#
我在端口4242上打开浏览器进行测试,它工作正常

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

CL-USER> (hunchentoot:stop #<HUNCHENTOOT:ACCEPTOR (host *, port 4242)>)
#<HUNCHENTOOT:ACCEPTOR (host *, port 4242)>
CL-USER>(hunchentoot:stop#)
#
这仅适用于相应开始返回的打印表示

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

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

如有任何解释或见解,将不胜感激

这就是黏液“魔力”。事实上,在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)>
CL-USER>(defvar*server*(hunchentoot:start(生成实例'hunchentoot:easy acceptor:port 4242)))
*服务器*
CL-USER>(hunchentoot:停止*服务器*)
#

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

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

这个想法主要来自BBN(Zdybel等人,信息表示系统,1981),然后是Symbolics Lisp机器和便携式机器,它在窗口系统中记录输出过程中的底层对象。这些演示文稿用于图形和文本输出,是其用户界面的重要基础


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

是的,我通常会保存这个对象,这样我就可以阻止它了。因此SLIME获取返回的对象并将其链接到打印表示。它也对返回的lambdas执行此操作。尼斯特不知道它在那里。但它确实提出了一个问题:如果我不希望所有的对象仍然存在怎么办?也许清除缓冲区会杀死他们。这肯定会使他们无法接近。也许这值得再问一个问题。太好了。感谢您提供手册的链接和Zdybel参考(谷歌很容易找到PDF)。