请在 2024 年 Clojure 调查问卷 中分享您的想法!

欢迎!有关如何使用本网站,请参阅 关于 页面获取更多信息。

0
ClojureScript

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

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

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

3 个答案

0

评论由:mfikes 提供

补丁不再适用,可能是因为 CLJS-970。

0

评论由:thheller 提供

我在我的方法中发现了一个问题。我的目标是在使用 :advanced 编译时启用 Closure 编译器消除断言。这对于使用 {{goog.define}} 对于 * } 的工作非常出色,但是如果您尝试稍后调整 define,则编译器将报错,因为 {{goog.define}} 变量不允许在运行时调整。

(binding [*assert* false] (something-that-asserts))

这在 CLJ 上有效,但不在 CLJS 上,因为 * } 仅在编译时进行检查。如果您使用 {{:elide-asserts true}} 编译,则也无法将断言绑定到 true,因为代码已经不存在。

因此,无论如何都需要做出一些妥协,我认为最好的解决方案是在 goog.define 中有一个选项,让编译器决定是否消除断言,独立于 * },然后将断言检查本身移入 JavaScript 而不是编译器。

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

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