Clojure 2024 调查问卷! 中分享你的想法。

欢迎!请查看 关于 页面,了解更多关于其工作方式的详细信息。

+4
Clojure
编辑

目前 clojure.core/*assert* 的默认值是 true

这对库的创建者和消费者有一些影响。

作为一个库的创建者,你不能只是随意添加断言来帮助开发/测试,因为这会让大部分用户在生产环境付出性能代价,因为他们的 *asserts* 将被启用。

作为一个库的消费者,因为你不知道哪些库使用了断言,你必须始终记得在必要时禁用它们。

由于 Clojure 中的断言是一个检查 *assert* 的宏,因此需要设置变量的值,这需要在加载任何命名空间之前完成,这使得在 Clojure 中全局地禁用断言变得困难。

相反,Java 默认禁用所有断言,因此库的创建者不必为此担心,而消费者可以在开发时通过提供 java -ea(启用断言)来显式启用它们。

由于我猜更改 *assert* 的默认值可能会因为向后兼容性问题而变得棘手,所以也许可以添加一个类似于 Rust 的 debug-assert,默认不启用。

在我看来,重要的是拥有一个简单的不可变检查指令,我们知道默认情况下它不会影响性能,这样我们的代码库在测试和开发时就可以不与生产性能耦合。

另外两种选择是更好的 assert 默认值,一个是为 false,另一个是 java.lang.ClassdesiredAssertionStatus() 方法的返回值,这似乎会根据是否提供了 -ea 标志返回真/假,这也将默认为 false。但由于大多数 Clojure 用户已经依赖于默认启用 assert,这可能不是一种选项。














我打算将https://docs.clojure.org/clojure.spec.alpha/assert 添加到对话中,因为默认情况下它是关闭的(在运行时,但可以在运行时为测试开启,也可以在编译时完全禁用)。

推荐使用此库方法时唯一的问题是,你会因为存在无自定义消息的 Spec 失败而陷入困境,就像常规的 assert。
如果我的理解正确,你将只在 dev/test 时间使用 debug-assert 进行断言。然后你会使用常规的 assert 在生产中使用的断言。

这开始感觉有点像日志了。有没有可能在当前的 assert 函数中添加类似于日志级别的 "级别" 吧?
我提出 debug-assert,只是因为它不会破坏 assert 的向后兼容性。我认为由于它们可以被禁用,所以 assert 如其所见不应用于任何与生产相关的内容。我认为我们应该在我们的代码中用来检查重要内容的应该是我们的正常(when-not something (throw ...))。
debug-assert 的整个目的就是有 java 中的 assert,你可以用它来检查你的归纳变量,但你可以确信它不会误入生产而让使用你代码的用户支付性能代价。

所以我不认为这里有级别,它只是一种开发者工具。

登录注册 回答此问题。

...