我在一个.cljc文件中定义了一个宏
(defmacro ->map
"(->map a b) ;;=> {:a a :b b}"
[& 符号]
(assert (every? symbol? symbols))
`(hash-map
~@(interleave (map keyword symbols) symbols)))
有时(但并非总是)会在浏览器日志中看到错误
router.cljc:203 未捕获错误:断言失败:(every? symbol? symbols)
在 Function.dre.coll.__GT_map.cljs$core$IFn$_invoke$arity$variadic (coll.cljc:563)
在 dre$coll$__GT_map (coll.cljc:560)
在 events.cljs:64
为什么编译时宏最终在目标JS中以运行时函数的形式出现?非常令人惊讶。经过Slack上的讨论,发现这与自托管ClojureScript有关。Slack中的对话记录在附件slack.txt中。
库
https://github.com/cgrand/macrovich 为我找到了解决方案。
如果编译器在非自托管模式下不生成运行时函数,或者至少发出警告,那将很有帮助。