gpt4 book ai didi

lisp - "Overloading"具有不同参数列表的 CLOS 多方法

转载 作者:太空宇宙 更新时间:2023-11-03 18:41:27 24 4
gpt4 key购买 nike

我正在尝试在 Common Lisp 中执行一个多重方法的“重载调用”。这是案例的简化摘要:

(defclass foo ()
((slotty :accessor slotty :initarg :slotty)))

(defclass bar ()
((slotty :accessor slotty :initarg :slotty)))

(defparameter *foo* (make-instance 'foo :slotty "defnoodle"))
(defparameter *bar* (make-instance 'bar :slotty "Chocolate"))

(defmethod contrived ((f foo) (b bar))
(format t "i pity the foo ~A, who has a bar ~A ~%" (slotty f) (slotty b)))

(contrived *foo* *bar*)

输出:我可怜 foo defnoodle,他有一 block 巧克力

但是一旦我尝试定义下一个方法:

 (defmethod contrived ((f foo))
(format t "i just pity the foo ~A ~%" (slotty f)))

CL 生气了:

; The generic function #<STANDARD-GENERIC-FUNCTION CONTRIVED (1)>
; takes 2 required arguments; was asked to find a method with
; specializers (#<STANDARD-CLASS FOO>)
; [Condition of type SB-PCL::FIND-METHOD-LENGTH-MISMATCH]
; See also:
; Common Lisp Hyperspec, FIND-METHOD [:function]

有谁知道我在这里做错了什么?我知道 initialize-instance 具有类似的灵 active ,因为人们应该能够为每个类和每个任意数量的参数识别 n 个 initialize-instance 方法。

(defmethod initialize-instance :after ((f foo) &key)
())

但我不清楚如何将其转换为我上面给出的普通示例。而且我觉得我可能找错人了,因为这是 MOP 的一部分。

最佳答案

你写道:有谁知道我在这里做错了什么?

明确一点:CLOS 不支持这一点。在单个通用函数的方法的方法参数列表中不能有不同数量的必需参数。调度仅对必需的参数起作用。 Common Lisp 不支持“重载”。

INITIALIZE-INSTANCE 使用以下语法定义:

initialize-instance instance &rest initargs &key &allow-other-keys => instance

所有方法都有一个必需的参数,即实例。调度仅针对此对象进行。然后它允许各种关键字参数 - 不会为它们进行分派(dispatch)。

因此,您需要就通用函数应采用的所需参数的数量达成一致,并在您的代码中以这种方式调用它。

有关规则,请参阅 CL Hyperspec:Congruent Lambda-lists for all Methods of a Generic Function .

关于lisp - "Overloading"具有不同参数列表的 CLOS 多方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21895659/

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