clojure引用内部让

时间:2015-06-10 20:42:54

标签: clojure macros eval

引用(语法和非语法)似乎无法检测let语句中的变量:

(let [foo 1] (eval `(print foo)))

这将生成错误或使用绑定到foo的任何先前值绑定(def foo bar)。有没有办法让语法引用使用" local"改为定义的变量?

2 个答案:

答案 0 :(得分:2)

取消引用以取代该值:

(let [foo 1] (eval `(print ~foo)))

...或显式绑定变量:

(declare :^dynamic foo)
(binding [foo 1] (eval '(print foo)))

有关详细信息,请参阅Variable scope + eval in Clojure

答案 1 :(得分:1)

凯文

你很接近,这应该做的工作(基本上,你应该在引用的语句中取消引用本地var)

(let [foo 1] (eval `(print ~foo)))

此外,虽然eval肯定是一种有效的语言功能,但总体目标是什么?可能有更好的方法。