我有一个s-expression绑定到Common Lisp中的变量:
(defvar x '(+ a 2))
现在我想创建一个函数,在调用时,它会在定义它的范围内计算表达式.我试过这个:
(let ((a 4)) (lambda () (eval x)))
和
(let ((a 4)) (eval `(lambda () ,x)))
但这两个都会产生问题:EVAL会评估顶层的代码,因此我无法捕获表达式中包含的变量.请注意,我不能将LET表单放在EVAL中.有什么解决方案吗?
编辑:那么如果没有EVAL问题的解决方案,它还能怎样做呢?
编辑:有一个问题,我到底想要做什么.我正在编写一个编译器.我想接受一个s表达式,其中变量在定义表达式的词汇环境中关闭.将它写成宏可能确实更好.
您需要创建具有必要绑定的代码.在代码周围包装一个LET并绑定要在代码中使用的每个变量:
(defvar *x* '(+ a 2)) (let ((a 4)) (eval `(let ((a ,a)) ,*x*)))