Common Lisp Object System方法执行顺序

Dim*_*tri 2 lisp common-lisp clos

我有以下两个类:

(defclass person () ())

(defmethod speak ((s person) string)
    (format t "-A" string))

(defmethod speak :before ((s person) string)
    (print "Hello! "))

(defmethod speak :after ((s person) string)
    (print "Have a nice day!"))


(defclass speaker (person) ())

(defmethod speak ((i speaker) string)
  (print "Bonjour!"))


(speak (make-instance 'speaker) "Can I help yoU?")
Run Code Online (Sandbox Code Playgroud)

而这个的输出是:

"Hello! "                                                                                                                                                                                                                                               
"Bonjour!"                                                                                                                                                                                                                                              
"Have a nice day!" 
Run Code Online (Sandbox Code Playgroud)

我想弄清楚的是这些方法是如何按照"顺序"执行的.我似乎无法掌握正在发生的事情和原因.据说有一个规则优先于此,但我不知道在哪里找到它.例如,为什么"Hello!Can I help you"在这种情况下不会发射?

mal*_*per 9

当您没有任何around方法时,方法应用程序的顺序是:所有方法之前从最具体到最不具体,然后是最具体的主要方法,然后是从最不具体到最具体的后方法.在您的情况下,您有两个主要方法(方法没有:名称旁边的或之前):一个指定人,另一个指定扬声器.由于说话者比人更具体,因此只调用说话者主要方法.如果要调用多个主要方法,请查看call-next-method.