У меня есть s-выражение, связанное с переменной в Common Lisp:
(defvar x '(+ a 2))
Теперь я хочу создать функцию, которая при вызове оценивает выражение в области, в которой оно было определено. Я пробовал это:
(let ((a 4))
(lambda () (eval x)))
и
(let ((a 4))
(eval `(lambda () ,x)))
Но оба они создают проблему: EVAL оценит код на верхнем уровне, поэтому я не могу перехватить переменные, содержащиеся в выражении. Обратите внимание, что я не могу поместить форму LET в EVAL. Есть ли какое-нибудь решение?
РЕДАКТИРОВАТЬ: Итак, если нет решения проблемы EVAL, как еще это можно сделать?
РЕДАКТИРОВАТЬ: Возник вопрос о том, что именно я пытаюсь сделать. Я пишу компилятор. Я хочу принять s-выражение с переменными, закрытыми в лексической среде, где выражение определено. Возможно, лучше написать макрос.