Порядок (: перед/: после) метод вызов в Clos?
-
27-10-2019 - |
Вопрос
Мне нужна помощь в понимании порядка выполнения для следующего кода.
Я создаю экземпляр pie
, используя следующее:
(cook (make-instance 'pie))
Я знаю, что LISP выполняет функции из наиболее специфических до наименьших специфических ... однако, не похоже, что это следуют после (defmethod cook ((p pie))
называется.
Я бы предположил (defmethod cook :after ((f food))
& (defmethod cook :after ((p pie))
быть выполненным в противоположном порядке, так как наш экземпляр pie
, а не родительский класс, food
.
Спасибо, любой вклад будет высоко ценится.
(defclass food () ())
(defmethod cook :before ((f food))
(print "A food is about to be cooked."))
(defmethod cook :after ((f food))
(print "A food has been cooked."))
(defclass pie (food)
((filling :accessor pie-filling
:initarg :filling
:initform 'apple)))
(defmethod cook ((p pie))
(print "Cooking a pie.")
(setf (pie-filling p) (list 'cooked (pie-filling p))))
(defmethod cook :before ((p pie))
(print "A pie is about to be cooked."))
(defmethod cook :after ((p pie))
(print "A pie has been cooked."))
(setq pie-1 (make-instance 'pie :filling 'apple))
С выводом, таким как:
"A pie is about to be cooked."
"A food is about to be cooked."
"Cooking a pie."
"A food has been cooked."
"A pie has been cooked."
(COOKED APPLE)
Решение
Видеть Раздел 7.6.6.2 (Стандартная комбинация метода) общей гиперспекции LISP. Анкет Вот самый актуальный отрывок:
Методы до самого специфического первого порядка, в то время как методы после выполнения выполняются в порядке наименьшего специфического первого порядка. Обоснование дизайна для этого различия можно проиллюстрировать примером. Предположим, что класс C1 изменяет поведение своего суперкласса C2, добавляя методы и методы. Независимо от того, определяется ли поведение класса C2 непосредственно методами на C2 или унаследовано от его суперклассов, не влияет на относительный порядок вызова методов в экземплярах класса C1. Метод класса C1 запускается перед всеми методами класса C2. Метод класса C1 работает после всех методов класса C2.
Другие советы
Первичные методы выполняются наиболее специфическими сначала, а затем следующий специфический через
CALL-NEXT-METHOD
.а
:before
Методы выполняются наиболее специфическими.а
:after
Методы выполняют наименее специфическую первую.