2011-12-28 67 views
4

我的问题是接下来,我尝试使用let将这个瓦尔EVAL列表到一个让上Clojure的

,如果我做ASIGN值来评估一些增值经销商列表(def a (list * 'x 'y))(let [x 3 y 3] (eval a))我有一个 CompilerException了java.lang.RuntimeException:无法解析符号:X在这种情况下,编译:(NO_SOURCE_PATH:6)

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

是否存在一种方法来正确绑定x和y并对列表进行评估?

ty!

回答

2

好了,你也evallet的表情,看看这是你需要什么:

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

编辑:

根据该意见,这会为你的情况下工作:

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

更好的是,使用quasiquoting:

(def a (list * 'x 'y)) 
(eval `(let ~'[x 3 y 3] ~a)) 
5

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

3
(def ^:dynamic x 4) (def ^:dynamic y 4) 
user=> (binding [x 3 y 3] (eval a)) 
9 
user=> (eval a) 
16 
相关问题