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

欢迎!请参阅关于页面了解如何使用本网站的一些更多信息。

0
ClojureScript

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

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

:elide-asserts 不受影响以使它尽可能简单,但可以在 goog.define 之上构建而不是实际影响编译输出。

3 个答案

0

评论由:mfikes

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

0

评论由:thheller

我发现我的方法还存在一个问题。我的目标是让关闭编译器在 :advanced 编译时消除断言。这通过使用 goog.define 对于 * } 完美地工作,但如果你尝试更改定义,编译器会报错,因为 goog.define 变量不允许在运行时调整。

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

这在 CLJ 中是有效的,但不在 CLJS 中,因为 * } 只在编译时进行检查。如果你用 {{:elide-asserts true}} 编译,你也无法将断言绑定到 true,因为代码不再存在。

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

愿意编写补丁,如有兴趣。

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