从s表达式创建lambda

Eri*_*and 2 lisp lambda closures eval common-lisp

我有一个s-expression绑定到Common Lisp中的变量:

(defvar x '(+ a 2))
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个函数,在调用时,它会在定义它的范围内计算表达式.我试过这个:

(let ((a 4))
  (lambda () (eval x)))
Run Code Online (Sandbox Code Playgroud)

(let ((a 4))
  (eval `(lambda () ,x)))
Run Code Online (Sandbox Code Playgroud)

但这两个都会产生问题:EVAL会评估顶层的代码,因此我无法捕获表达式中包含的变量.请注意,我不能将LET表单放在EVAL中.有什么解决方案吗?

编辑:那么如果没有EVAL问题的解决方案,它还能怎样做呢?

编辑:有一个问题,我到底想要做什么.我正在编写一个编译器.我想接受一个s表达式,其中变量在定义表达式的词汇环境中关闭.将它写成宏可能确实更好.

Rai*_*wig 5

您需要创建具有必要绑定的代码.在代码周围包装一个LET并绑定要在代码中使用的每个变量:

(defvar *x* '(+ a 2))

(let ((a 4))
  (eval `(let ((a ,a))
           ,*x*)))
Run Code Online (Sandbox Code Playgroud)