Cljs宏需要完全限定符号

时间:2016-12-06 21:26:29

标签: clojure macros clojurescript

在正常的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

我们遇到了一些错误。这问题为什么?你怎么解决这个问题?

1 个答案:

答案 0 :(得分:3)

这是因为您需要在符号+获得之前对其进行评估,以便在将符号传递给其他命名空间之前解析符号。你可以这样引用:

(defmacro evaluate
  [to-eval]
  `(eval ~to-eval))

查看“Clojure For the Brave and True”中有关宏的章节,以获得更好的解释:http://www.braveclojure.com/writing-macros/#Simple_Quoting