在 let 中引用 clojure

clojure quoting inside let

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

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

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

取消引用以替换值:

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

...或显式绑定您的变量:

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

详情见Variable scope + eval in Clojure

凯文

你很接近,这应该可以完成工作(基本上,你应该在引用的语句中取消引用本地变量)

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

此外,虽然 eval 确实是一个有效的语言函数,但总体目标是什么?可能还有更好的方法。

弗兰克