在lisp中为类定义自定义setf

时间:2012-06-02 15:55:06

标签: oop common-lisp

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

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

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

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

然而,钢铁公司常见的lisp会说功能没有定义,即使我已经评估过它。有人知道这里有什么问题吗?

2 个答案:

答案 0 :(得分:1)

看起来很正确。请注意,您正在通过指定:accessor blocker重新定义您创建的现有setf方法。 SBCL将为您提供style-warning

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

答案 1 :(得分:0)

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

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

有关示例,请参阅Practical Common Lisp中的this章节。