【发布时间】:2008-10-19 02:04:54
【问题描述】:
我有一个 s 表达式绑定到 Common Lisp 中的一个变量:
(defvar x '(+ a 2))
现在我想创建一个函数,当调用它时,它会在定义它的范围内评估表达式。我试过这个:
(let ((a 4))
(lambda () (eval x)))
和
(let ((a 4))
(eval `(lambda () ,x)))
但这两者都会产生一个问题:EVAL 将在顶层评估代码,因此我无法捕获表达式中包含的变量。请注意,我不能将 LET 表格放入 EVAL。有什么解决办法吗?
编辑:那么,如果 EVAL 问题没有解决方案,还能怎么办?
编辑:有一个关于我到底想做什么的问题。我正在编写一个编译器。我想接受在定义表达式的词法环境中关闭变量的 s 表达式。把它写成宏可能确实更好。
【问题讨论】:
-
你从哪里得到内部表达式?除非您是从外部源读取它,否则您可以尝试使用宏而不是 eval。
-
我正在从外部来源阅读它。
标签: lisp lambda eval common-lisp closures