需要完全限定符号的 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
在正常的 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