Специализация поведения метода описания, как объяснила Соня Э. Кин.

В книге С. Кин Объектно-ориентированное программирование в COMMON LISP она вводит специализацию поведения describe универсальной функции, предоставляя :after метод для некоторых классов, но это приведет к ошибке в SBCL и Закрытие:

COMMON-LISP:DESCRIBE already names an ordinary function or a
macro. [Condition of type SB-INT:SIMPLE-PROGRAM-ERROR]

Это происходит, когда я пытаюсь изменить поведение describe для своего класса:

(defclass klasse ()
  ())

(defmethod describe :after ((obj klasse))
  (print "Klasse!"))

Поскольку книга написана в 1989 году, эти политики блокировки произошли после выхода книги, или я упустил что-то еще?


person Student    schedule 12.04.2020    source источник
comment
насколько мне известно, в книге описывается язык эпохи до стандартизации ANSI (стандартизация произошла в 1994 году). В ansi cl describe действительно является обычной функцией, а есть общая функция с именем describe-object. Этот должен подойти, я думаю   -  person leetwinski    schedule 12.04.2020
comment
clhs говорит следующее: Фактический акт описания объекта реализуется описанием объекта. описать существует как интерфейс, в первую очередь для управления параметрами по умолчанию (включая преобразование аргументов t и nil в объекты потока) и для запрета любых возвращаемых значений из description-object.   -  person leetwinski    schedule 12.04.2020
comment
поэтому вы указываете (defmethod describe-object :after ((obj klasse) stm) (print "Klasse!" stm)) и вызываете его с помощью describe: (describe (make-instance 'klasse)). это поможет   -  person leetwinski    schedule 12.04.2020
comment
@leetwinski: вы можете написать ответ...   -  person Rainer Joswig    schedule 13.04.2020


Ответы (1)


Насколько мне известно, в книге описан язык эпохи до стандартизации ANSI (стандартизация произошла в 1994 году). В ansi cl describe это действительно обычная функция, в то время как есть общая функция с именем describe-object

CLHS сообщает следующее по этой теме:

Фактический акт описания объекта реализуется описанием объекта. описать существует как интерфейс, в первую очередь для управления параметрами по умолчанию (включая преобразование аргументов t и nil в объекты потока) и для запрета любых возвращаемых значений из description-object.

Итак, что вам нужно сделать, это указать

(defmethod describe-object :after ((obj klasse) stm) 
    (print "Klasse!" stm)) 

и назовите его с описанием:

CL-USER> (describe (make-instance 'klasse))
;;=> #<KLASSE {1001C3C1F3}>
;;     [standard-object]
;;   No slots.

;;   "Klasse!" 
;;   ; No values
person leetwinski    schedule 13.04.2020