Вопрос

Мне нужна помощь в понимании порядка выполнения для следующего кода.

Я создаю экземпляр 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 Методы выполняют наименее специфическую первую.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top