Функции не имеют доступа к лексической среде своих вызывающих.Точнее, во время оценки вы не можете получить доступ к значениям лексических переменных, зная только их символы.Только макросы имеют доступ к объектам среды .
Специальным переменным
Вы можете использовать динамическое связывание:
(defun foo ()
(declare (special a))
(symbol-value 'a))
(let ((a 3))
(declare (special a))
(foo))
=> 3
В вашем случае вы должны собратьсимвол вдоль его значения, используя SYMBOL-vaLUE
на всех ваших символах.
В связи с вашим вопросом, как динамически привязать переменные к значениям, для которых известны имена и / или значения переменныхво время оценки;см. специальный оператор PROGV
.
Макросы
Вы можете получить, например, список ассоциаций, написав следующий код:
(acons 'a a (acons 'b b nil))
В зависимости отВ случае использования вашего вопроса вы можете захотеть иметь макрос, который расширяется до такого кода, который ссылается на переменные, которые вы хотите оценить.