2013-04-02 9 views
5

Ich verwende SBCL, Emacs, Slime und Quicklisp, um verschiedene Pakete zu installieren.In Common Lisp was ist eine gedruckte Darstellung?

I instanziiert und einen hunchentoot Akzeptor starten wie so,

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

ich testen, indem Sie den Browser auf Port 4242 zu öffnen und es funktioniert gut.

Dann ist es zu stoppen, ich die gedruckte Darstellung kopieren und den Befehl, etwa so:

CL-USER> (hunchentoot:stop #<HUNCHENTOOT:ACCEPTOR (host *, port 4242)>) 
#<HUNCHENTOOT:ACCEPTOR (host *, port 4242)> 

Dies funktioniert nur mit der gedruckten Darstellung durch den entsprechenden Start zurückgegeben.

Das ist überraschend für mich. Ich dachte, dass die gedruckte Darstellung einfach Text zurückgegeben wurde, vermutlich weil das Objekt selbst nicht gezeigt werden konnte. Als solche dachte ich, es wäre ziemlich ordentlich, dass hunchentoot: stop die Textzeichenfolge verwenden könnte, um das Objekt zu finden. Aber dann, mit mehr Experimentieren, bemerkte ich, dass ich die gedruckte Darstellung verwenden musste, die dem Anfang entspricht, nicht irgendjemandem. Ich merke auch, dass wenn ich meine Maus über die gedruckte Darstellung halte, das gesamte Segment hervorhebt. Es ist also überhaupt kein Text, sondern das Objekt, das tatsächlich in der REPL ist, und ich kann es benutzen.

Auf der einen Seite ist das, was zurückgegeben wird, eine Druckdarstellung, so dass ich es sehen kann, aber auf der anderen Seite ist es das eigentliche Objekt, das ich kopieren und in die REPL einfügen kann. Ist das richtig? Ich denke, es muss sein, weil ich es mache. Das ist total erstaunlich für mich.

Jede Erklärung oder Einsicht würde sehr geschätzt werden.

Antwort

6

Dies sind sogenannte "Präsentationen". Siehe das SLIME-Benutzerhandbuch, Presentations.

Die Dokumentation erklärt auch, was nicht weg gehen, wenn die Objekte geschieht ...

Die Idee meist von BBN kommt (Zdybel, et al., Informations-Präsentations-System, 1981), dann die Symbolics Lisp Maschine und die portable Common Lisp Interface Manager, die die zugrunde liegenden Objekte während der Ausgabe in seinem Windows-System aufzeichnet. Diese Präsentationen dienen zur grafischen und textlichen Ausgabe und sind eine wichtige Grundlage für die Benutzeroberfläche.

SLIME hat die Idee für seine REPL aufgenommen.

+0

Ausgezeichnet. Vielen Dank für den Link zum Handbuch und für die Zdybel-Referenz (Google findet leicht ein PDF). – kes

7

Dies ist SLIME "Magie". Tatsächlich kann man mit einer solchen "Druckdarstellung" in Lisp nichts anfangen, weil es als unlesbares Objekt gilt: Probieren Sie es im Konsolenmodus Ihrer Implementierung aus. Aber SLIME erinnert mich an den Verein zu dem eigentlichen Objekt, so wird es das Objekt für die #<...> Sache ersetzen - wie eine Art von Lisp-Maschine ...

Was korrekt funktioniert und immer ist dies:

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

Ja, normalerweise speichere ich das Objekt, damit ich es stoppen kann. So erhält SLIME das zurückgegebene Objekt und verknüpft es mit der Druckdarstellung. Dies geschieht auch mit zurückgegebenen Lambdas. Nettes Feature wusste nicht, dass es da war. Außer es wirft eine Frage auf: Was, wenn ich nicht will, dass alle Objekte noch existieren? Vielleicht werden sie durch das Löschen des Puffers getötet. Es würde sie sicherlich unzugänglich machen. Vielleicht ist das eine weitere Frage wert. – kes