目前 clojure.core/*assert*
的默认值为 true
。
这对库创建者和使用者都有一些影响。
作为库创建者,你不能只是到处添加断言以帮助你在开发/测试中,因为这将使大多数用户在生产中付出性能代价,因为他们会运行在 *asserts*
启用状态下。
作为库使用者,由于你不知道哪些库使用了断言,你必须始终记得在必要时禁用它们。
由于 Clojure 中禁用断言并不容易,因为 `assert` 是一个检查 *assert*
的宏,需要在该名称空间加载之前设置变量的值,这使得问题更加严重。
相比之下,Java 默认禁用所有断言,因此库创建者不必担心这个问题,而消费者可以在开发时通过提供 java -ea
(启用断言)显式地启用它们。
由于我猜测更改 *assert*
的默认值可能因为向后兼容性问题而变得有疑问,所以可能可以添加一个类似于 Rust 中的 `debug-assert`,默认情况下不会启用。
在我看来,重要的是要有一个简单的符号检查指令,我们知道默认情况下它不会影响性能,这样在测试和开发过程中加固我们的代码库就不会与生产性能绑定。
其他两种选择是更好的 assert 默认值,一个是 false
,另一个是 java.lang.Class desiredAssertionStatus()
的值,它似乎根据是否提供了 -ea
标志返回 true/false,这默认也将是 false
,但由于大多数 Clojure 用户已经依赖于 assert 默认为 true,这可能不是一个选择。