需要完全限定符号的 Cljs 宏

Cljs macros requiring fully qualified symbols

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

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

这是因为您需要在将符号 + 传递给宏 之前对其进行 评估,以便在将符号传递给其他命名空间之前对其进行解析.您可以像这样引用来做到这一点:

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

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