评论由:thheller 提供
我在我的方法中发现了一个问题。我的目标是在使用 :advanced 编译时启用 Closure 编译器消除断言。这对于使用 {{goog.define}} 对于 * } 的工作非常出色,但是如果您尝试稍后调整 define,则编译器将报错,因为 {{goog.define}} 变量不允许在运行时调整。
(binding [*assert* false] (something-that-asserts))
这在 CLJ 上有效,但不在 CLJS 上,因为 * } 仅在编译时进行检查。如果您使用 {{:elide-asserts true}} 编译,则也无法将断言绑定到 true,因为代码已经不存在。
因此,无论如何都需要做出一些妥协,我认为最好的解决方案是在 goog.define 中有一个选项,让编译器决定是否消除断言,独立于 * },然后将断言检查本身移入 JavaScript 而不是编译器。
如有兴趣,我很乐意编写补丁。