Скажем, я пишу следующий фрагмент кода (пожалуйста, простите ошибки, я лисповский новичок, и я не могу запустить CL на этой машине)Этот код CLOS приводит к ошибке выполнения или ошибке времени компиляции в Common Lisp?
(defclass o()())
(defclass a (o)())
(defclass b (o)())
(defgeneric m (x))
(defmethod m ((x o))
(print "O")
)
(defmethod m ((x a))
(print "A")
(call-next-method (make-instance 'a))
)
(defmethod m ((x b))
(print "B")
(call-next-method (make-instance 'b))
)
(setq aa (make-instance 'a))
(m aa) ;prints A, then O
(setq bb (make-instance 'b))
(m bb) ;prints B, then O
По моим ожиданиям, он должен напечатать то, что написано в комментариях без каких-либо жалоб.
Что произойдет, если я добавлю следующий код?
(defclass c (a b)())
(setq cc (make-instance 'c))
(m cc)
Если я понимаю стандартную комбинацию метода, применяемые методы cc
будут отсортированы как (m a)
, (m b)
, (m o)
и (m b)
не будет вызываться call-next-method
успешно. Но что на самом деле произойдет? Будет ли жаловаться CL, когда я определяю класс c
и скажу, что он лишает цель недействительности цепочки методов для общей функции m
? Или будет ошибка времени выполнения?
Я предполагаю, что вы хотели, чтобы первый 'defmethod' специализировал свой аргумент на' o', правильно? – Svante
Вы должны использовать 'make-instance' вместо' allocate-instance', и он принимает символ, поэтому вам нужно процитировать его, когда он будет указан буквально. – Svante
Я писал свой код, используя только спецификацию, поэтому я мог сделать некоторые ошибки. Благодарю. – Alexey