我有一个s表达式绑定到Common Lisp中的一个变量:
(defvar x '(+ a 2))现在我想创建一个函数,当调用它时,在定义它的作用域中计算表达式的值。我试过了:
(let ((a 4))
  (lambda () (eval x)))和
(let ((a 4))
  (eval `(lambda () ,x)))但这两者都产生了一个问题: EVAL将在顶层计算代码,因此我无法捕获表达式中包含的变量。请注意,我不能将LET表单放入EVAL中。有什么解决方案吗?
编辑:那么如果EVAL问题没有解决方案,还能怎么做呢?
编辑:有一个关于我到底想要做什么的问题。我正在写一个编译器。我希望接受在定义表达式的词法环境中闭合变量的s表达式。把它写成宏可能确实更好。
发布于 2009-03-05 13:15:42
您需要创建具有必要绑定的代码。用字母括起你的代码,并绑定你想要在你的代码中可用的每个变量:
(defvar *x* '(+ a 2))
(let ((a 4))
  (eval `(let ((a ,a))
           ,*x*)))发布于 2008-10-19 02:54:18
CLISP实现了一个扩展来评估词法环境中的形式。从它是一个扩展的事实来看,我怀疑你不能以一种符合标准的方式做到这一点。
(ext:eval-env x (ext:the-environment))参见http://clisp.cons.org/impnotes.html#eval-environ。
发布于 2008-10-20 19:30:38
你想解决的实际问题是什么?最有可能的是,您试图以错误的方式处理它。词法绑定是针对在其作用域内以词法出现的内容,而不是针对从外部获得的随机内容。
也许你想要一个动态闭包?这样的东西在Common Lisp中是不存在的,尽管在一些Lisp方言中是存在的(就我所知,像Pico Lisp )。
请注意,您可以执行以下操作,这与此类似:
(defvar *a*)
(defvar *x* '(+ *a* 2))  ;'
(let ((a 10))
  ;; ...
  (let ((*a* a))
    (eval *x*)))不过,我建议你认真考虑一下你是否真的想这样做。
https://stackoverflow.com/questions/215883
复制相似问题