Специализация поведения метода описания, как объяснил Соня Э. Кин - PullRequest
1 голос
/ 12 апреля 2020

В книге С. Кина Объектно-ориентированное программирование в ОБЩЕМ ЛИСП она вводит специализацию поведения функции describe generi c, предоставляя метод :after для некоторых классов, но это приведет к ошибке в SBCL и Clozure:

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 года эти правила блокировки произошли после выхода книги или я что-то упустил?

1 Ответ

2 голосов
/ 13 апреля 2020

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

CLHS говорит следующее на этот предмет :

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

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

(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
...