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

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

+4
Clojure
编辑

当前,`clojure.core/*assert*` 的默认值是 true

这对库的创建者用户有影响。

作为一个库的创建者,您不能在代码的任何地方随意添加断言来帮助您在开发/测试过程中,因为这会使大多数用户在生产中因为使用 *asserts* 而性能受影响。

作为库的消费者,由于您不知道使用了断言的库,因此您必须时刻记住关闭它们,以防万一。

由于在Clojure中全局禁用断言并不容易,因为 `assert` 是一个检查 *assert* 值的宏,因此需要在加载任何命名空间之前设置变量的值。

相反,Java 默认禁用所有断言,因此库创建者不必考虑这一点,而消费者可以在开发时通过提供 java -ea (启用断言) 明确启用它们。

由于我猜更改 *assert* 的默认值可能由于向后兼容性问题而变得很棘手,所以我们可能会像Rust那样添加一个 `debug-assert`,默认情况下不会启用。

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

其他两个选项是更好的 assert 默认值,一个是 false,另一个是 java.lang.Class desiredAssertionStatus() 返回的值,该值似乎取决于是否提供了 -ea 标志,默认情况下也是 false。但是,由于大多数Clojure用户已经依赖于默认情况下 assert 为真,这可能不是一个可行的选项。














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

将这个功能作为库方法推荐的唯一问题是,当你使用Spec时,你会依赖于Spec失败,因为没有提供自定义消息的选项,就像常规的assert一样。
by
如果我的理解正确,你会配备debug-assert以在dev/test时间进行断言。然后你会使用常规assert在生产中需要的断言。

这开始感觉有点像日志记录。是否有可能为当前的assert函数添加类似日志级别的“级别”?
by
我提出debug-assert只是为了避免assert向后兼容性的问题。我认为assert就像现在这样不应该用于任何生产相关的事情,因为它们可以被禁用。我认为我们应该使用我们的正常(when-not something (throw ...))来检查代码中的重要内容。
debug-assert的整个目的是为了有一个在Java中存在的东西,你可以在dev中“滥用”它来检查你的不变性,但同时你确信不会不小心将其放入生产环境中,并使用户为性能付出代价。

所以在这个问题中,我看不到级别,它只是一个开发工具。

登录注册来回答这个问题。

...