目前 clojure.core/*assert*
的默认值是 true
。
这对库的创建者和消费者有一些影响。
作为库的创建者,您不能只在开发/测试中添加断言以帮助您,因为这会让大多数用户在生产环境中付出性能代价,因为他们将启用 *asserts*
。
作为库的消费者,由于您不知道哪些库正在使用断言,您必须始终记得在必要时禁用它们。
由于在 Clojure 中全局禁用它们并不容易,因为 assert
是一个检查 *assert*
的宏,需要在该变量加载任何命名空间之前设置其值,所以这种情况变得更糟。
与 Java 相反,Java 默认禁用所有断言,因此库的创建者无需考虑这一点,而消费者可以在开发时分显地启用它们,通过提供 java -ea
(启用断言)。
由于我认为改变 *assert*
的默认值可能会由于向后兼容性问题而成为问题,所以可能可以添加一个类似 Rust 的 debug-assert
,它不会默认开启。
据我看,关键部分是有一个简单的.Invariant 检查指令,我们知道它默认不会影响性能,所以强化我们的测试和开发代码库不会在默认情况下与生产性能耦合。
其他两个选项是更好的 assert
默认值,一个是 false
,另一个是 java.lang.Class desiredAssertionStatus()
的值,它似乎根据是否提供了 -ea
标志返回 true/false,这也会默认为 false
。但由于大多数 Clojure 用户已经依赖于 assert 默认为 true,这也许不是一个选项。