在Clojure中,我可以使用刻度字符或quote
:
user=> '(+ 2 2)
(+ 2 2)
user=> (quote (+ 2 2))
(+ 2 2)
但是对于syntax-quote,我似乎只能使用反引号运算符:
user=> `(+ 2 2)
(clojure.core/+ 2 2)
user=> (syntax-quote (+ 2 2))
CompilerException java.lang.RuntimeException: Unable to resolve symbol: syntax-quote in this context, compiling:(NO_SOURCE_PATH:1:1)
有没有办法在不使用反引号字符的情况下调用syntax-quote?
答案 0 :(得分:3)
您可以使用clojure.tools.reader
(require '[clojure.tools.reader :as r])
-> nil
(r/syntax-quote +)
-> clojure.core/+
答案 1 :(得分:1)
这些问题已基本得到回答here。从那时起,创建了clojure-in-clojure分析器,因此您可以使用以下方法获得与语法引用类似的内容:
(use '[clojure.tools.analyzer.passes.jvm.emit-form :only [emit-form]]
'[clojure.tools.analyzer.jvm :only [analyze]])
(emit-form (analyze '(+ 2 2)))
;-> (clojure.lang.Numbers/add 2 2)
正如您所看到的,该函数实际上已解析为将执行的Java代码,而不仅仅是解析符号的命名空间。