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

欢迎!请查阅关于页面以获取更多关于如何使用此功能的信息。

0
ClojureScript

此补丁将 } 布尔值转换为 goog.define,并在运行时(而非仅在编译时)检查 }。

Closure 定义选项允许 closure 编译器在 :advanced 下删除断言,而 :none 构建(保留断言)。这是防止 :advanced 构建(重用 :none 编译(缓存)文件)的唯一剩余问题之一。

:elide-asserts 不受影响,以尽可能保持简单,但可以基于 goog.define 构建,而不是实际影响编译输出。

3 答案

0

评论由:mfikes 发表

Patch no longer applies, probably owing to CLJS-970.

0

评论由: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而不是编译器。

如果感兴趣,我很乐意编写补丁。

0
参考: https://clojure.atlassian.net/browse/CLJS-1494(由thheller报告)
...