2012-06-02 2 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)) 

Однако, сталь банка common lisp будет говорить, что функция не определена, хотя я ее оценил. Кто-нибудь знает, что здесь не так?

+3

Примечание: вам не нужно определять (setf blocker), если ключевое слово: accessor уже определено для вас. – GoZoner

ответ

1

Это выглядит правильно. Обратите внимание, что вы переопределяете уже существующий метод setf, который вы создали, указав :accessor blocker. SBCL предоставит вам style-warning.

Ваша ошибка в другом месте. Может быть, вы в другом пакете? Попробуйте показать шаги, которые вы предприняли в своей среде разработки, для компиляции и загрузки этих форм и попыток запуска этого вызова метода.

+0

Я попытался проверить, установлен ли setf-blocker с помощью (fboundp 'setf-blocker), но он вернулся нуль. И когда я попытался определить его сам, он все еще жалуется, что функция не определена. – Mark

+0

Работает в моем env, с последними SBCL и OS X. В вашей форме defclass отсутствует заключительный этап; это проблема? Хорошая книга, хотя; также проверьте «Искусство протокола MetaObject» –

+0

@Mark: эта функция не называется 'setf-blocker', а' (setf blocker) '. Покажите код, который вы пытаетесь оценить. – Svante

0

Перед определением любых методов необходимо объявить общую функцию.

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

См. Главу this в Практическом Общем Лиспе для примера.

+1

Неверный. Если не существует общей функции, она будет создана для вас. Подробнее см. Http://l1sp.org/7.6.2. – Xach

+0

О, вы правы, SBCL выпускает только STYLE-WARNING. Кстати, ваша ссылка не работает. ([7.6.2] (http://www.lispworks.com/documentation/HyperSpec/Body/07_fb.htm)) – Daimrod

Смежные вопросы