用其它组合手段来定义方法也是有可能的 ── 举例来说,一个返回所有可用主方法的和的通用函数。操作符 (Operator)方法组合可以这么理解,想像它是 Lisp 表达式的求值后的结果,其中 Lisp 表达式的第一个元素是某个操作符,而参数是按照具体性调用可用主方法的结果。如果我们定义 price
使用 +
来组合数值的通用函数,并且没有可用的 :around
方法,它会如它所定义的方式动作:
如果有可用的 :around
方法的话,它们根据优先级决定,就像是标准方法组合那样。在操作符方法组合里,一个 around
方法仍可以通过 call-next-method
调用下个方法。然而主方法就不可以使用 call-next-method
了。
现在 price
方法会使用 +
方法组合;任何替 price
定义的 defmethod
必须有 +
来作为第二个参数。如果我们使用 price
来定义某些类型,
则可获得一件正装的价钱,也就是所有可用方法的总和:
你也可以使用 standard
,yields 标准方法组合。
一旦你指定了通用函数要用何种方法组合,所有替该函数定义的方法必须用同样的机制。而现在如果我们试着使用另个操作符( :before
或 after
)作为 defmethod
给 price
的第二个参数,则会抛出一个错误。如果我们想要改变 的方法组合机制,我们需要通过调用 fmakunbound
来移除整个通用函数。