【问题标题】:CLOS: Method combination with arbitrary functionCLOS:任意函数的方法组合
【发布时间】:2018-07-22 21:26:56
【问题描述】:

在阅读关于 CLOS(在 Paul Graham 的 ANSI Common Lisp 中)时,我注意到有九个函数可以作为第二个参数传递给 defmethod+andappendlistmaxminnconcorprogn。根据this answer,它们被称为简单方法组合

问题

为什么只有这九个?我不能将任意函数作为第二个参数传递的原因是什么?

我想要的示例

假设我将xor 定义为

(defun xor (&rest args)
   (loop for a in args counting (not (null a)) into truths
      finally (return (= truths 1))))

(这当然可以改进)。我想使用xor定义几个描述衣服及其组合的类:

(defgeneric looks-cool (x)
   (:method-combination xor))

(defclass black-trousers () ())
(defclass quilt () ())
(defclass white-shirt () ())
(defclass hawaii-shirt () ())

(defmethod looks-cool xor ((tr black-trousers)) nil)
(defmethod looks-cool xor ((qu quilt)) t)
(defmethod looks-cool xor ((ws white-shirt)) nil)
(defmethod looks-cool xor ((hs hawaii-shirt)) t)

(defclass too-stiff (black-trousers white-shirt) ())
(defclass scottish  (quilt white-shirt) ())
(defclass also-good (black-trousers hawaii-shirt) ())
(defclass too-crazy (quilt hawaii-shirt) ())

现在,如果编译(它没有编译),我将能够使用 Lisp 来指导我穿什么:

> (looks-cool (make-instance 'too-stiff))
  NIL
> (looks-cool (make-instance 'scottish))
  T
> (looks-cool (make-instance 'also-good))
  T
> (looks-cool (make-instance 'too-crazy))
  NIL

我很清楚这是一个相当人为的例子,没有实际意义。不过,我想知道背后是否有一些更深层次的原因,或者对九个功能的限制是否只是为了让实现更容易。

【问题讨论】:

    标签: oop common-lisp language-design clos method-combination


    【解决方案1】:

    使用标准的 Common Lisp 宏 DEFINE-METHOD-COMBINATION 定义自己的简单方法组合

    例子:

    (define-method-combination xor :identity-with-one-argument t)
    

    然后:

    CL-USER 5 > (mapcar #'looks-cool (list (make-instance 'too-stiff)
                                           (make-instance 'scottish)
                                           (make-instance 'also-good)
                                           (make-instance 'too-crazy)))
    (NIL T T NIL)
    

    如果我们看一下(define-method-combination xor :identity-with-one-argument t)xor 这个名字有几个含义:

    • 它使用 运算符 xor - 一个函数、宏或特殊形式 - 不仅允许使用函数。如果操作符名称应该与方法组合名称不同 -> 使用 :operator 关键字来指定。

    • 它定义了一个名为xor方法组合。此名称可用于defgeneric

    • 它定义了一个方法限定符xor。这可以用于defmethod

    请注意,还可以使用 DEFINE-METHOD-COMBINATION 定义更复杂的方法组合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-25
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      相关资源
      最近更新 更多