评论由:thheller
我发现我的方法还存在一个问题。我的目标是让关闭编译器在 :advanced 编译时消除断言。这通过使用 goog.define 对于 * } 完美地工作,但如果你尝试更改定义,编译器会报错,因为 goog.define 变量不允许在运行时调整。
(binding [*assert* false] (something-that-asserts))
这在 CLJ 中是有效的,但不在 CLJS 中,因为 * } 只在编译时进行检查。如果你用 {{:elide-asserts true}} 编译,你也无法将断言绑定到 true,因为代码不再存在。
因此,无论如何都需要做出一些妥协。据我所知,最好的解决方案是有一个 goog.define,让编译器决定是否消除断言,独立于 * },然后将断言检查本身移动到 js 中而不是编译器。
愿意编写补丁,如有兴趣。