Лисп: Как переопределить строковое представление по умолчанию для класса CLOS?

StackOverflow https://stackoverflow.com/questions/7382122

Вопрос

В 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 в качестве макроса общего формата для таких ситуаций

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top