4

我的问题是下一个,我尝试使用 let 为这个 vars 分配值来评估一个包含一些 vars 的列表

如果我这样做(def a (list * 'x 'y))并且(let [x 3 y 3] (eval a))我有 CompilerException java.lang.RuntimeException: Unable to resolve symbol: x in this context, compile:(NO_SOURCE_PATH:6)

但如果我跑 了(def x 4) (def y 4)(eval a)我有 16,无论如何,如果我再次跑,(let [x 3 y 3] (eval a))我有 16,

是否存在正确绑定 x 和 y 并评估列表的方法?

泰!

4

3 回答 3

5

let定义无法从 eval 函数的主体访问的词法范围绑定。这与任何其他功能没有什么不同。但是,使用创建的绑定def是可访问的,因为它们是命名空间全局的。所有函数都可以访问命名空间全局变量,只要它们是公共的。

于 2011-12-29T00:08:59.687 回答
3
(def ^:dynamic x 4) (def ^:dynamic y 4)
user=> (binding [x 3 y 3] (eval a))
9
user=> (eval a)
16
于 2011-12-29T01:00:02.033 回答
2

好吧,你也可以eval表达let,看看这是否是你需要的:

(eval '(let [x 3 y 3] (* x y)))

编辑 :

根据评论,这将适用于您的情况:

(def a (list (list * 'x 'y)))
(eval (concat '(let [x 3 y 3]) a))

更好的是,使用准引用:

(def a (list * 'x 'y))
(eval `(let ~'[x 3 y 3] ~a))
于 2011-12-28T23:52:45.937 回答