2015-04-25 2 views
1

Это настоящий вопрос начинающих, я думаю, но я не мог найти ответ здесь. Моя проблема: Я хотел бы установить значение слота класса так:CLOS: конвертировать символ в accessor

(setf (accessor class) value) 

я написал небольшую функцию для этого:

(defun set-class-slots (class slot value) 
     (setf (slot class) value)) 

Я использую это в течение loop, в котором я выполняю итерацию через 2 списка (слоты (список символов) и значения (список чисел)) и хотел бы установить несколько слотов экземпляра для значений.

(loop for slot in slots for value in values do 
     (set-class-slots <myclass> slot value) 
    ) 

Ошибка я получаю:

"Неопределенный оператор (SETF слот) в виде ((слот SEtF) #: | Магазин-вар-773597 | #. G773598"

Я думаю, проблема в том, что setf в моей функции не использует значение, предоставленное для ввода arg. 'Slot', но считывает «slot» в качестве оператора.

Я пробовал разные вещи, функцию-символ, funcall, и т. д., но больше не знаю, что делать, поскольку я также не совсем понимаю, что происходит не так.

Любая помощь будет принята с благодарностью.

Спасибо, Marleynoe

+0

Любая причина вы не используете 'SLOT-value'? – Barmar

+0

Я работаю в среде, основанной на lisp, и для классов, которые мне нужно изменить, к сожалению SLOT-VALUE не работает (т. Е. Слот остается неизмененным). – marleynoe

+0

Какая среда? Это обычная реализация Lisp? Если нет, обновите теги вопроса соответствующим образом. – acelent

ответ

2

Вы можете использовать FDEFINITION, чтобы получить функцию значение (setf XXX) функции:

(defun set-class-slots (class slot value) 
    (funcall (fdefinition `(setf ,slot)) value class)) 
Смежные вопросы