У меня есть список, который содержит некоторые символы и значения. Цель состоит в том, чтобы установить слот класса с помощью метода доступа, чей символ предоставляется списком:
(defclass my-class ()
((attr :accessor attr)))
(let ((to-call '(attr "some-value"))
(obj (make-instance 'my-class)))
(setf `(,(car to-call) obj) (cadr to-call)))
Пробовал через макрос:
(defmacro call-accessor (to-call)
`(setf (,(car to-call) obj) "some-value"))
(let ((to-call '(attr "some-value"))
(obj (make-instance 'my-class)))
(call-accessor to-call))
Что тоже не работает, поскольку to-call
— это символ, а не список.
eval
не работает, так какto-call
является лексической переменной;- Невозможно сделать
let
над макросом, чтобы дать ему список; - Я пробовал с
with-slots
иwith-accessors
, но проблема осталась прежней, потому что они тоже макросы. - Я рассмотрел макросы, которые объявляют другой макрос, и символ-макролет тоже.
Как я могу установить слот с помощью аксессора, соответствующего символу в моем списке?
Спасибо.