Лисп: Как переопределить представление строки по умолчанию для класса CLOS? - PullRequest
14 голосов
/ 12 сентября 2011

В Common Lisp, как я могу переопределить строковое представление по умолчанию для класса CLOS, чтобы при вызовах format или princ печаталось что-то понятное, даже если объекты этого класса встроены в другие типы, такие как спискиили массивы?

Например, если я вызываю (format t "~a~%" x), когда x содержит экземпляр моего класса решения, я хочу, чтобы он печатал что-то вроде #<SOLUTION genes: #(1 2 3) scores: #(4 5) rank: 6> вместо #<SOLUTION {BB7CD31}>.

Пока что все, что мне удалось выяснить, это написание пользовательских функций для обработки структур печати, которые, как я знаю, будут содержать экземпляры этого класса, но это утомительно.Конечно, Лисп предоставляет какой-то способ получить эту функциональность бесплатно?

Ответы [ 3 ]

17 голосов
/ 12 сентября 2011

Вы должны смотреть на print-object и print-unreadable-object. Предположим, у вас есть класс с именем FOO, например, так:

(defclass foo ()
  ((name :accessor foo-name)))

И вы хотите напечатать экземпляры, подобные этому: #<FOO "xyz">, где "xyz" - это содержимое слота name. В этом случае следующая реализация print-object будет делать то, что вы хотите:

(defmethod print-object ((obj foo) out)
  (print-unreadable-object (obj out :type t)
    (format out "~s" (foo-name obj))))
11 голосов
/ 12 сентября 2011

Выезд print-object.

1 голос
/ 01 июля 2012

Если вы также посмотрите 22.1.3.13 Печать других объектов , он предлагает print-unreadable-object в качестве макроса общего формата для таких ситуаций

...