次のコードの実行順序を理解するのに助けが必要です。
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)