EVAL列表到一个让上Clojure的
问题描述:
我的问题是接下来,我尝试使用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!
答
好了,你也eval
的let
的表情,看看这是你需要什么:
(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))
答
let
定义了不能从eval函数的主体访问的词法范围的绑定。这与其他功能没有区别。但是,使用def
创建的绑定是可访问的,因为它们是全局命名空间。所有函数都可以访问命名空间全局变量,只要它们是公共的。
答
(def ^:dynamic x 4) (def ^:dynamic y 4)
user=> (binding [x 3 y 3] (eval a))
9
user=> (eval a)
16