2013-04-02 89 views
5

我使用SBCL,emacs,slime和quicklisp來安裝各種軟件包。In Common Lisp什麼是印刷表示?

我實例,並開始一個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中複製和粘貼的實際對象。這是正確的嗎?我想這一定是因爲我在做。這對我來說真是太神奇了。

任何解釋或見解將不勝感激。

回答

6

這些都是所謂的「演示文稿」。請參閱SLIME用戶手冊,Presentations

的文件也解釋如果對象不消失,會發生什麼......

的想法主要來自BBN(Zdybel,等人,信息演示系統,1981年),然後是範符號的Lisp機器和便攜式Common Lisp Interface Manager,它在窗口系統中輸出時記錄底層對象。這些演示文稿適用於圖形和文本輸出,並且是其用戶界面的重要基礎。

SLIME已經拿起了它的REPL的想法。

+0

非常好。感謝您閱讀本手冊的鏈接,以及Zdybel參考資料(Google輕鬆找到PDF)。 – kes

7

這是SLIME「魔術」。事實上,你不能在Lisp中使用這種「打印表示」,因爲它被認爲是一個不可讀的對象:在你的實現的控制檯模式下嘗試。但泥記得聯想到實際的對象,因此它將替代對象爲#<...>東西 - 有點像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)> 
+2

是的,我通常保存對象,以便我可以阻止它。所以SLIME獲取返回的對象並將其鏈接到打印表示。它也用返回的lambdas來做到這一點。好的功能不知道它在那裏。除了它提出了一個問題:如果我不想要所有的對象仍然存在?也許清除緩衝區會殺死它們。這肯定會讓他們無法進入。也許這完全值得另一個問題。 – kes