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

kes*_*kes 5 lisp emacs sbcl hunchentoot read-eval-print-loop

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

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

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

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

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

CL-USER> (hunchentoot:stop #<HUNCHENTOOT:ACCEPTOR (host *, port 4242)>)
#<HUNCHENTOOT:ACCEPTOR (host *, port 4242)>
Run Code Online (Sandbox Code Playgroud)

这仅适用于相应启动返回的打印表示.

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

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

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

Vse*_*kin 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)>
Run Code Online (Sandbox Code Playgroud)

  • 是的,我通常保存对象,所以我可以阻止它.因此,SLIME获取返回的对象并将其链接到打印表示.它也用返回的lambda做到了这一点.不错的功能不知道它在那里.除了它确实提出了一个问题:如果我不希望所有的对象仍然存在怎么办?也许清除缓冲区可以杀死它们.它肯定会使它们无法进入.可能这完全是值得的另一个问题. (2认同)

Rai*_*wig 6

这些都是所谓的"演示文稿".请参阅SLIME用户手册,演示文稿.

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

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

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