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中的实际对象.这是正确的吗?我想这一定是因为我在做.这对我来说真是太神奇了.
任何解释或见解将不胜感激.
这是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用户手册,演示文稿.
文档还解释了如果对象没有消失会发生什么......
这个想法主要来自BBN(Zdybel等,An Information Presentation System,1981),然后是Symbolics Lisp机器和便携式Common Lisp接口管理器,它在窗口系统的输出过程中记录底层对象.这些演示文稿适用于图形和文本输出,是其用户界面的重要基础.
SLIME已经接受了其REPL的想法.