2013-04-02 13 views
5

Używam SBCL, emacs, slime i quicklisp do instalowania różnych pakietów.W Common Lisp co to jest wydrukowane przedstawienie?

I instancji i zacznij akceptor hunchentoot jak tak,

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

przetestować, otwierając przeglądarkę na porcie 4242 i działa dobrze.

Potem go zatrzymać, mogę skopiować wydrukowany reprezentację i wydawać polecenia, tak jak poniżej:

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

Działa to tylko z wydrukowanym reprezentacji zwrócony przez odpowiedni start.

Jest to dla mnie zaskakujące. Myślałem, że wydrukowane przedstawienie było po prostu zwrócone, prawdopodobnie dlatego, że sam obiekt nie mógł zostać pokazany. W związku z tym pomyślałem, że to całkiem fajne, że hunchentoot: stop może użyć ciągu tekstowego, aby znaleźć obiekt. Ale potem z większą ilością eksperymentów zauważyłem, że musiałem użyć drukowanej reprezentacji odpowiadającej początkowi, a nie tylko jednej. Zauważyłem również, że po umieszczeniu myszy nad wydrukowaną reprezentacją podświetla cały segment. Więc to nie jest tekst w ogóle, ale obiekt, który jest rzeczywiście w REPL i mogę go używać.

Tak więc z jednej strony powraca to reprezentacja wydruku, więc widzę ją, ale z drugiej strony jest to obiekt, który mogę skopiować i wkleić do REPL. Czy to jest poprawne? Chyba to musi być dlatego, że to robię. Jest to dla mnie całkowicie niesamowite.

Wszelkie wyjaśnienia lub wglądy byłyby bardzo mile widziane.

Odpowiedz

6

Są to tak zwane "Prezentacje". Zobacz instrukcję użytkownika SLIME, Presentations.

Dokumentacja wyjaśnia również, co się dzieje, jeśli obiekty nie odchodź ...

Chodzi głównie pochodzi z BBN (Zdybel, et al., Informacja Prezentacja Systemu, 1981), a następnie symboliką Lisp Maszyna i urządzenie przenośne Common Lisp Interface Manager, które rejestruje leżące pod nim obiekty podczas wyprowadzania w systemie okien. Te prezentacje tam pracują dla graficznego i tekstowego wyjścia i są ważną podstawą dla jego interfejsu użytkownika.

SLIME wyłapał pomysł na REPL.

+0

Doskonały. Dziękuję za link do podręcznika oraz do odniesienia do Zdybel (Google z łatwością znajduje plik PDF). – kes

7

To jest "magia" SLIME. W rzeczywistości nie można nic zrobić z taką "reprezentacją druku" w Lisp, ponieważ jest ona uważana za nieczytelny obiekt: spróbuj go w trybie konsoli swojej implementacji. Ale SLIME pamięta stowarzyszenie do rzeczywistego obiektu, więc będzie zastąpić obiekt do tego #<...> rzeczy - trochę jak Lisp Maszynie ...

Co będzie działać prawidłowo i zawsze jest to:

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

Tak, zwykle zapisuję obiekt, aby go zatrzymać. Tak więc SLIME otrzymuje zwracany obiekt i łączy go z reprezentacją wydruku. Robi to również z zwracanymi lambdami. Fajna funkcja nie wiedziała, że ​​tam była. Z wyjątkiem tego, że rodzi pytanie: co, jeśli nie chcę, aby cały obiekt (y) nadal istniał? Być może wyczyszczenie bufora zabije je. Z pewnością sprawiłoby, że byłyby one niedostępne. Być może jest to warte zupełnie innego pytania. – kes