2012-06-02 50 views
2

假設我有一類叫做板:定義自定義SETF類在口齒不清

(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會說功能沒有定義。有人知道這裏有什麼問題嗎?

+3

注意:您不需要定義(setf攔截器),因爲:accessor關鍵字已經爲您定義了一個。 – GoZoner

回答

1

看起來正確。請注意,您正在通過指定:accessor blocker來重新定義已創建的setf方法。 SBCL會給你一個style-warning

你的錯誤是在別的地方。也許你有不同的包裝?嘗試顯示您在IDE中執行的步驟,以編譯和加載這些表單,並嘗試運行該方法調用。

+0

我試圖檢查setf-blocker是否使用(fboundp'setf-blocker)來定義,但它返回零。當我嘗試自己定義它時,它仍然抱怨函數沒有被定義。 – Mark

+0

在我的env中工作,使用最新的SBCL和OS X.您的defclass表單缺少關閉的父項;這是問題嗎?好書雖然;也檢查'元對象協議的藝術' –

+0

@Mark:該函數不被稱爲'setf-blocker',而是'(setf_blocker)'。顯示您正在嘗試評估的代碼。 – Svante

0

你必須在定義任何方法之前聲明一個通用函數。

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

請參閱this Chapter in Practical Common Lisp爲例。

+1

不正確。如果不存在通用函數,則會爲您創建一個函數。有關詳細信息,請參閱http://l1sp.org/7.6.2。 – Xach

+0

哦,你是對的,SBCL只發出一個STYLE-WARNING。 Btw你的鏈接不起作用。 ([7.6.2](http://www.lispworks.com/documentation/HyperSpec/Body/07_fb.htm)) – Daimrod