CLOS中(:before/:after)方法调用的顺序



我需要一些帮助来理解下面代码的执行顺序。

我创建了一个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)

参见Common Lisp HyperSpec的7.6.6.2节(标准方法组合)。以下是最相关的段落:

before方法以最具体的第一顺序运行,而在方法以最不具体的优先顺序运行之后。设计这种差异的基本原理可以用一个例子来说明。假设类C1修改了它的超类C2的行为,通过添加方法前和方法后。的行为是否类C2是由C2上的方法直接定义的,或者是从它的类调用的相对顺序不受超类的影响类C1的实例上的方法。类C1的before方法运行在类C2的所有方法之前。类C1的after方法在之后运行所有类C2的方法

  • 主要方法首先执行最特定的,然后通过CALL-NEXT-METHOD执行下一个特定的。

  • :before方法优先执行。

  • :after方法是执行最少特定优先。

相关内容

  • 没有找到相关文章

最新更新