评论由:thheller 发表
我的方法中还有一个我发现的问题。我的目标是允许 Closure Compiler 在 :advanced 编译中使用时删除断言。这对使用 {{goog.define}} for * } 的操作工作得非常好,但如果您稍后尝试调整该定义,编译器会抱怨,因为 {{goog.define}} 变量不允许在运行时调整。
(binding [*assert* false] (something-that-asserts))
这在 CLJ 中有效,但在 CLJS 中无效,因为 * } 只在编译时检查。如果编译时使用 {{:elide-asserts true}},您也无法绑定 assert 到 true,因为代码不再存在。
因此,无论哪种方式,都必须做出一定的妥协。在我看来,最佳解决方案是使用goog.define,让编译器决定是否删除断言,独立于* },然后将断言检查本身移入js而不是编译器。
如果感兴趣,我很乐意编写补丁。