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

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

+3
Clojure

这看起来并不像是一个快捷方式,而且它使我失去了一些有用功能,比如向断言添加消息。

3 个答案

+4

如果您更喜欢使用assert及其消息,那么似乎永远不会。

确实,预/后条件似乎从未得到扩展。它们好像缺少了错误消息的功能。
作者:
我认为你的答案是正确且实用的。

从大部分情况来看,没有人使用这些元数据。看起来指定规范是该方式的首选,用于实现原本可由 :pre/:post 完成的功能,但这些功能从未得到充分利用。
+4
作者:

Michael Fogus(《The Joy of Clojure》的作者)

:pre 和 :post 比起 assert 的一个优势是,前者允许“断言”可能来源于不同于函数主体的不同源。 [...] :pre 和 :post 还能使执行一些复杂的自动测试生成变得相对容易,并且作为附加优势为函数提供形式化文档。Chris Houser 还添加了一个我以前不知道的有趣观点:“用 assert 代替 :pre 通常相当直接,如果你必须这么做。用 assert 替代 :post 则是一个痛点。”听起来很合理。在此基础上,Chas Emerick 认为使用 :pre 和 :post 可以涵盖 assert 使用量的 99.5%,并提供简单且一致的钩子。

来源:fogus: Clojure的 :pre 和 :post,评论编号 14。

作者:
我花了一些时间来试图弄清楚如何实现提到的一些事情。

:pre/:post 作为元数据存在,位于 var 的元数据的 :arglists 上。因此,您可以读取这些元数据来执行测试生成。这很有意义,我知道它是如何发生的(特别是与 spec 一起)。

更改这些元数据不会更改断言!所以我看不出它们来自除主体之外的其他来源。
+1

还应考虑函数规范:[点击查看](https://clojure.org/guides/spec#_specing_functions)

...