在正常的repl中,这有效:
(defmacro evaluate
[to-eval]
(eval to-eval))
(evaluate +) ;=> #function[clojure.core/+]
然而在clojurescript中使用单独的文件时如此:
file one: macro.clj
(ns space.macro)
(defmacro evaluate
[to-eval]
(eval to-eval))
file two: core.cljs
(ns space.core
(:require-macros [space.macro :refer [evaluate]))
(evaluate clojure.core/+) ;=> No error
(evaluate +) ;=> Unable to resolve symbol: + in this context
我们遇到了一些错误。这问题为什么?你怎么解决这个问题?
答案 0 :(得分:3)
这是因为您需要在符号+
获得之前对其进行评估,以便在将符号传递给其他命名空间之前解析符号。你可以这样引用:
(defmacro evaluate
[to-eval]
`(eval ~to-eval))
查看“Clojure For the Brave and True”中有关宏的章节,以获得更好的解释:http://www.braveclojure.com/writing-macros/#Simple_Quoting