我有一个 s 表达式绑定到 Common Lisp 中的一个变量:
(defvar x '(+ a 2))
现在我想创建一个函数,当调用它时,它会在定义它的范围内评估表达式。我试过这个:
(let ((a 4))
(lambda () (eval x)))
和
(let ((a 4))
(eval `(lambda () ,x)))
但这两者都会产生一个问题:EVAL 将在顶层评估代码,因此我无法捕获表达式中包含的变量。请注意,我不能将 LET 表单放入 EVAL。有什么解决办法吗?
编辑:所以如果没有解决 EVAL 问题,还能怎么做?
编辑:有一个关于我到底想做什么的问题。我正在编写一个编译器。我想接受在定义表达式的词法环境中关闭变量的 s 表达式。将它写成宏可能确实更好。