Я использую 'eieio и 'cl-lib и пытаюсь определить метод object-print для своего класса, как описано здесь:
https://www.gnu.org/software/emacs/manual/html_mono/eieio.html#Basic-Methods
(cl-defmethod object-print ((this data-object) &optional strings)
"Return a string with a summary of the data object as part of the name."
(apply #'cl-call-next-method this
(format " value: %s" (render this))
strings))
Я хочу сделать это, чтобы видеть содержимое своих экземпляров объектов при использовании edebug.
Когда я реализую этот пример в своем собственном коде, он выдает сообщение об ошибке the function ‘render’ is not known to be defined.
В дополнение к сообщению об ошибке Flycheck предлагает: ‘object-print’ is an obsolete generic function (as of 26.1); use ‘cl-print-object’ instead. Я не могу найти никакой документации по функции cl-print-object, когда я гуглю, и я не могу угадать, как ее реализовать:
(cl-defmethod cl-print-object ((this card) &optional strings)
"Return a string with a summary of the data object as part of the name."
(apply #'cl-call-next-method this
(format " value: %s" (slot-value this 'value))
strings))
Я не знаю, что поставить вместо (slot-value this 'value). Похоже, слот не нужен.
Как я могу реализовать функцию cl-print-object? Или есть лучший способ увидеть содержимое экземпляра объекта EIEIO при отладке внутри edebug?





Я не понимаю систему CLOSoid elisp, но что-то вроде этого, по крайней мере, для начала:
(defclass foo ()
((x :initform 1
:inirarg :x
:reader foo-x)))
(defmethod cl-print-object ((f foo) stream)
(princ (format "#<%s x %s>"
(class-name (class-of f))
(foo-x f))
stream))
Сейчас:
ELISP> (make-instance 'foo :x 2)
#<foo x 2>
ELISP> (defclass bar (foo) ())
bar
ELISP> (make-instance 'bar :x 2)
#<bar x 2>
Очевидно, что в реальной жизни вы хотите извлечь больше информации из объекта: я не знаю, есть ли эквивалент CL print-unreadable-object, который обеспечивает хороший подход к этому, не требуя от вас выполнения всей работы вручную.
Принтер по умолчанию использует eieio-class-slots Думаю, например #s(test 3 eieio--unbound)
Это работает, спасибо. Я переключился на использование cl-defmethod, eieio-class-name и eieio-object-class, как было предложено в предупреждениях об устаревании Flycheck.