3

假设我有一个名为 board 的类:

(defclass board ()
 ((blocker    :accessor blocker    :initarg :blocker    :initform  0))

根据这本书,我可以通过以下方式为拦截器定义一个自定义 setf:

(defmethod (setf blocker) (new-blocker (b board))
  (setf (slot-value b 'blocker) new-blocker))

然而,steel bank common lisp 会说函数未定义,即使我已经评估过了。有谁知道这里有什么问题?

4

2 回答 2

1

这看起来是正确的。请注意,您正在重新定义您通过指定创建的现有 setf 方法:accessor blocker。SBCL 会给你一个style-warning关于那个的。

你的错误在别的地方。也许你在不同的包裹里?尝试显示您在 IDE 中编译和加载这些表单并尝试运行该方法调用的步骤。

于 2012-06-02T18:33:20.150 回答
0

在定义任何方法之前,您必须声明一个泛型函数。

(defgeneric (setf blocker) (new-blocker board))

有关示例,请参阅Practical Common Lisp 中的这一章。

于 2012-06-02T17:28:39.657 回答