3

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

我使用以下内容创建了一个实例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)
4

2 回答 2

4

请参阅Common Lisp HyperSpec 的第 7.6.6.2 节(标准方法组合)。这是最相关的段落:

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

于 2011-12-04T00:26:30.740 回答
3
  • 主要方法首先执行最具体的,然后是下一个具体的 via CALL-NEXT-METHOD

  • 这些:before方法以最具体的方式执行。

  • 这些:after方法是最不具体的优先执行的。

于 2011-12-04T00:27:03.930 回答