引号(语法和非语法)似乎无法检测let语句中的变量:
(let [foo 1] (eval `(print foo)))
这将产生一个错误,或者使用(def foo bar)中绑定到foo的先前值。是否有一种方法,使语法引用使用"本地"变量,让定义代替?
取消引号以替代值:
(let [foo 1] (eval `(print ~foo)))
…或者显式绑定变量:
(declare :^dynamic foo)
(binding [foo 1] (eval '(print foo)))
Kevin
您已经接近了,这应该可以完成工作(基本上,您应该取消引用语句中的局部变量)
(let [foo 1] (eval `(print ~foo)))
另外,虽然eval
肯定是一个有效的语言函数,但总体目标是什么?也许还有更好的办法。