Вызов функции доступа
Цель состоит в том, чтобы установить слот класса с помощью средства доступа
Аксессором является пара функций.Вы можете получить часть, которая устанавливает значение через FDEFINITION
.Название функции представляет собой список (SETF accessor-name )
.Это необычно: Common Lisp имеет в этом случае имена функций, которые не являются символами, а списками.
CL-USER 14 > (let ((to-call '(attr "some-value"))
(obj (make-instance 'my-class)))
(funcall (fdefinition `(setf ,(first to-call)))
(second to-call)
obj)
(describe obj))
#<MY-CLASS 40200614FB> is a MY-CLASS
ATTR "some-value"
Использование функции call-accessor
:
CL-USER 25 > (let ((to-call '(attr "some-value"))
(obj (make-instance 'my-class)))
(flet ((call-accessor (obj to-call)
(funcall (fdefinition `(setf ,(first to-call)))
(second to-call)
obj)))
(call-accessor obj to-call)
(describe obj)))
#<MY-CLASS 402000220B> is a MY-CLASS
ATTR "some-value"
с использованием SETFс помощью APPLY, чтобы скрыть вызов FDEFINITION
Чтобы использовать setf
с вычисляемым средством доступа, может потребоваться использовать форму apply
и пользовательскую функцию.
Что-то вроде call-accessor
естественно будет функцией, потому что она выполняет поиск во время выполнения и принимает значения.Попытка использовать макрос была бы более полезной, если бы метод доступа был известен в время компиляции .
CL-USER 23 > (let ((to-call '(attr "some-value"))
(obj (make-instance 'my-class)))
(flet (((setf my-setter) (new-value object accessor)
(funcall (fdefinition `(setf ,accessor))
new-value
obj)))
(flet ((call-accessor (obj to-call)
(setf (apply #'my-setter obj (list (first to-call)))
(second to-call))))
(call-accessor obj to-call)
(describe obj))))
#<MY-CLASS 40200009AB> is a MY-CLASS
ATTR "some-value"
Выбор структуры данных
Я думаю, что все в порядке, чтобы вычислить функции доступа и тому подобное.Там могут быть случаи использования для этого.CLOS был разработан, чтобы быть динамичным и отражающим, чтобы позволить эти вещи.