假设我有一个名为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会说功能没有定义,即使我已经评估过它。有人知道这里有什么问题吗?
答案 0 :(得分:1)
看起来很正确。请注意,您正在通过指定:accessor blocker
重新定义您创建的现有setf方法。 SBCL将为您提供style-warning
。
你的错误在别的地方。你也许在不同的包装中吗?尝试显示您在IDE中为编译和加载这些表单所采取的步骤,并尝试运行该方法调用。
答案 1 :(得分:0)
在定义任何方法之前,您必须声明一个泛型函数。
(defgeneric (setf blocker) (new-blocker board))
有关示例,请参阅Practical Common Lisp中的this章节。