我在一个 .cljc 文件中定义了一个宏
(defmacro ->map
"(->map a b) ;;=> {:a a :b b}"
[& symbols]
(assert (every? symbol? symbols))
`(hash-map
~@(interleave (map keyword symbols) symbols)))
有时(但不总是)我会在浏览器日志中看到一个错误
router.cljc:203 Uncaught Error: Assert failed: (every? symbol? symbols)
at Function.dre.coll.__GT_map.cljs$core$IFn$_invoke$arity$variadic (coll.cljc:563)
at dre$coll$__GT_map (coll.cljc:560)
at events.cljs:64
为什么编译时宏在目标JS中变成了运行时函数?非常意外。经过Slack上的讨论,这最终与Self-hosted ClojureScript有关。Slack中的讨论记录在附件slack.txt中。
库
https://github.com/cgrand/macrovich为我提供了解决方案。
如果编译器在非Self Host模式下不生成宏的运行时函数,或者至少发出警告,将会很有帮助。