Подтвердить что ты не робот

Lisp: Как переопределить стандартное строковое представление для CLOS-класса?

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

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

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

4b9b3361

Ответ 2

Вы должны смотреть 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))))