2024 Clojure状态调查!中分享您的想法。

欢迎!请访问关于页面以获取更多关于这个工作方式的信息。

0
ClojureScript
我在一个 .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模式下不生成宏的运行时函数,或者至少发出警告,将会很有帮助。

1 答案

0
参考资料:https://clojure.atlassian.net/browse/CLJS-2636(由borkdude报告)
...