Лисп: Как переопределить строковое представление по умолчанию для класса CLOS?
-
29-10-2019 - |
Вопрос
В 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
, например:
И вы хотите напечатать экземпляры, подобные этому: #<FOO "xyz">
, где "xyz"
- это содержимое слота name
.В этом случае следующая реализация print-object
будет делать то, что вы хотите:
Если вы также посмотрите 22.1.3.13 Печать других объектов он предлагает print-unreadable-object в качестве макроса общего формата для таких ситуаций