Ответ 1
Отъезд print-object
.
В Common Lisp, как я могу переопределить стандартное строковое представление CLOS-класса, чтобы вызовы format
или princ
печатали что-то понятное, даже если объекты этого класса встроены в другие типы, такие как как списки или массивы?
Например, если я вызываю (format t "~a~%" x)
, когда x содержит экземпляр моего класса решения, я хочу, чтобы он печатал что-то вроде #<SOLUTION genes: #(1 2 3) scores: #(4 5) rank: 6>
вместо #<SOLUTION {BB7CD31}>
.
До сих пор все, что мне удалось выяснить, это писать пользовательские функции для обработки печатных структур, которые, как я знаю, будут содержать экземпляры этого класса, но это утомительно. Конечно, Lisp предоставляет какой-либо способ бесплатно получить эту функциональность?
Отъезд print-object
.
Вы должны смотреть 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))))
Если вы также смотрите 22.1.3.13 Печать других объектов предлагает print-unreadable-object в качестве макроса общего формата для таких ситуаций