gpt4 book ai didi

oop - CLOS:方法与任意函数的组合

转载 作者:行者123 更新时间:2023-12-02 08:05:59 26 4
gpt4 key购买 nike

在阅读 CLOS(Paul Graham 在 ANSI Common Lisp 中)时,我注意到有九个函数可以作为第二个参数提供给 defmethod:+, and, append, list, max, minnconcorprogn。根据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

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

最佳答案

使用标准的 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 定义更复杂的方法组合。

关于oop - CLOS:方法与任意函数的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51469397/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com