2013-04-02 18 views
5

Utilizzo SBCL, emacs, slime e quicklisp per installare vari pacchetti.In Common Lisp cos'è una rappresentazione stampata?

I istanziare e avviare un accettore hunchentoot in questo modo,

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

verifico aprendo il browser sulla porta 4242 e funziona benissimo.

Poi per fermarlo, posso copiare la rappresentazione stampata ed eseguire il comando, in questo modo:

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

Questo funziona solo con la rappresentazione stampata restituito dal corrispondente di avvio.

Questo è sorprendente per me. Pensavo che la rappresentazione stampata fosse semplicemente un testo restituito, presumibilmente perché l'oggetto stesso non poteva essere mostrato. Come tale, ho pensato che fosse abbastanza pulito quello hunchentoot: stop poteva usare la stringa di testo per trovare l'oggetto. Ma poi con più sperimentazione, ho notato che dovevo usare la rappresentazione stampata corrispondente all'inizio, non solo uno qualsiasi. Inoltre noto che quando metto il mouse sulla rappresentazione stampata, evidenzia l'intero segmento. Quindi non è affatto testo ma l'oggetto che è in REPL e posso usarlo.

Quindi da un lato ciò che viene restituito è una rappresentazione di stampa, quindi posso vederlo, ma dall'altro è l'oggetto reale che posso copiare e incollare nel REPL. È giusto? Immagino che debba essere perché lo sto facendo. Questo è assolutamente incredibile per me.

Qualsiasi spiegazione o intuizione sarebbe molto apprezzata.

risposta

6

Queste sono le cosiddette "presentazioni". Vedere il Manuale dell'utente SLIME, Presentations.

La documentazione spiega anche cosa succede se gli oggetti non vanno via ...

L'idea nasce per lo più da BBN (Zdybel, et al., Un'informazione Presentation System, 1981), poi la Symbolics Lisp Macchina e portatile Common Lisp Interface Manager, che registra gli oggetti sottostanti durante l'output nel suo sistema di finestre. Queste presentazioni funzionano per l'output grafico e testuale e rappresentano una base importante per la sua interfaccia utente.

SLIME ha raccolto l'idea per il suo REPL.

+0

Eccellente. Grazie per il collegamento al manuale e per il riferimento Zdybel (Google trova facilmente un PDF). – kes

7

Questa è "magia" SLIME. In realtà, non è possibile fare nulla con tale "rappresentazione di stampa" in Lisp, perché è considerato un oggetto illeggibile: provalo nella modalità console della tua implementazione. Ma SLIME ricorda l'associazione per l'oggetto reale, in modo che si sostituisce l'oggetto per che cosa #<...> - come una sorta di macchina Lisp ...

Che cosa funziona correttamente e sempre è questa:

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

Sì, normalmente salvi l'oggetto solo per poterlo interrompere. Quindi SLIME sta ricevendo l'oggetto restituito e collegandolo alla rappresentazione di stampa. Lo fa anche con lambda di ritorno. La bella funzionalità non sapeva che era lì. Tranne che solleva una domanda: cosa succede se non voglio ancora tutti gli oggetti esistenti? Forse cancellare il buffer li uccide. Li renderebbe certamente inaccessibili. Può essere che sia degno di un'altra domanda del tutto. – kes