如何在不使用反引号字符的情况下调用语法引用?

时间:2014-08-31 05:13:37

标签: clojure

在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?

2 个答案:

答案 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代码,而不仅仅是解析符号的命名空间。