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

Lisp CLOS中(:before/:after)方法调用的顺序?,lisp,common-lisp,clos,Lisp,Common Lisp,Clos,我需要一些帮助来理解以下代码的执行顺序 我使用以下命令创建饼图的实例: (cook (make-instance 'pie)) 我知道lisp从最具体到最不具体地执行函数。。但是,在调用(defmethod-cook((p-pie))之后,看起来并没有这样做 我假设(defmethod-cook:after((f-food))和(defmethod-cook:after((p-pie))以相反的顺序执行,因为我们的实例是pie,而不是父类food 谢谢, 任何意见都将不胜感激 (defclas

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

我使用以下命令创建
饼图的实例:

(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)
看,这是最相关的一段:

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

  • 首先执行最具体的主要方法,然后通过
    CALL-next-METHOD
    执行下一个具体方法

  • :在执行
    方法之前,首先执行最具体的方法

  • :在
    之后,首先执行最不特定的方法


您也可以提到。我发现它更容易阅读。CLtL当然是一个有趣的附加文档,可以阅读常见的Lisp概念,尽管它的两个版本都是标准过程中的中间步骤,而CLHS是基于其最终结果,即实际的标准。@Rörd:哦,我不知道,这是否意味着CLtL并非在所有科目中都是最新的,因此可能存在一些差异或错误?@Daimrod:是的,在CLtL2发布后进行了一些更改。但它已经非常接近标准,因此如果您远离更深奥的功能,应该是安全的。@Daimrod:Ansi标准是一个完全不同的文本。CLtL2在有趣,但它描述了一些以前的语言。例如,访问环境的函数没有纳入标准。它也令人费解,因为它是作为CLtL1加上注释的更改,再加上更多从未纳入标准的添加。