Что такое печатное представление в Common Lisp?

Я использую SBCL, emacs, slime и quicklisp для установки различных пакетов.

Я создаю экземпляр и запускаю приемник 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. Это правильно? Я думаю, это должно быть потому, что я делаю это. Это совершенно удивительно для меня.

Любое объяснение или понимание будет принята с благодарностью.


person kes    schedule 02.04.2013    source источник


Ответы (2)


Это так называемые «презентации». См. Руководство пользователя SLIME, Презентации.

В документации также объясняется, что произойдет, если объекты не исчезнут...

Идея в основном исходит от BBN (Zdybel, et al., An Information Presentation System, 1981), затем Symbolics Lisp Machine и портативной Диспетчер интерфейса Common Lisp, который записывает базовые объекты во время вывода в своей оконной системе. Эти презентации работают для графического и текстового вывода и являются важной основой для его пользовательского интерфейса.

SLIME подхватила идею для своего REPL.

person Rainer Joswig    schedule 03.04.2013
comment
Превосходно. Спасибо за ссылку на мануал и за ссылку Zdybel (Google легко находит PDF). - person kes; 04.04.2013

Это SLIME "волшебство". На самом деле, вы ничего не можете сделать с таким «печатным представлением» в Лиспе, потому что оно считается нечитаемым объектом: попробуйте его в консольном режиме вашей реализации. Но SLIME запоминает ассоциацию с фактическим объектом, поэтому он заменит этот объект #<...> — что-то вроде Lisp Machine...

Что будет работать правильно и всегда, так это:

CL-USER> (defvar *server* (hunchentoot:start (make-instance 'hunchentoot:easy-acceptor :port 4242)))
*server*
CL-USER> (hunchentoot:stop *server*)
#<HUNCHENTOOT:ACCEPTOR (host *, port 4242)>
person Vsevolod Dyomkin    schedule 02.04.2013
comment
Да, я обычно сохраняю объект, чтобы остановить его. Таким образом, SLIME получает возвращенный объект и связывает его с представлением печати. Он делает это и с возвращенными лямбда-выражениями. Хорошая функция, не знал, что она есть. За исключением того, что возникает вопрос: что, если я не хочу, чтобы все объекты сохранились? Возможно, очистка буфера убивает их. Это, безусловно, сделало бы их недоступными. Может быть, это достойно другого вопроса. - person kes; 03.04.2013