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

欢迎!请参阅 关于 页面以获取有关如何操作的更多信息。

+1 投票
记录和类型

fn 特殊形式和 defn 宏允许设置前置和后置条件。如果在 defprotocol 和 deftype 宏的方法声明中也能使用这些条件将很好。

目前我使用 extend 函数作为绕过方法,可以在关键字-名称和 fn 特殊形式映射中指定方法。

5 个答案

0 投票

评论由:michael-drogalis 提出

使用 {{:pre}} 和 {{:post}},我认为这不是一个好的主意。处理断言是一个两部分的博弈。机制需要考虑检测和反应,而后者是缺失的。

这不是一个完美的解决方案,因为它有点冗长,但是使用(链接:https://github.com/MichaelDrogalis/dire 文字:Dire)可能比使用 extend 更好。此外,你得到的是 {{:pre}} 和 {{:post}} 中缺失的“反应”功能。

关于协议前置条件的示例:https://gist.github.com/4471276

0 投票

评论由:akiel 提出

@Michael 我阅读了你的(链接:https://gist.github.com/4471276 文字:gist)和(链接:https://github.com/MichaelDrogalis/dire 文字:Dire)的 README。我认为 Erlang 的监督概念有其位置,但我不太喜欢它用于前置和后置条件。对我来说,这样的条件有两个目的

  1. 它们应该记录代码
  2. 它们应该快速失败以检测失败。

为了支持我的第一个观点,您的先决条件和后置条件与实际函数定义在词汇上太远了。关于第二个观点:我认为在违反规定的情况下,程序应该直接崩溃。也许可以用您的异常监督器之一封装程序的一部分来处理AssertionError。但我认为对于单个函数的先决条件和后置条件违例的处理并不是一个好主意。

0 投票

评论由:michael-drogalis 提出

@ Alexander 的观点确实正确。Dire 应该就是您描述的那样。从应用逻辑中分离出来,以及在崩溃中恢复的机会。无论如何,这是我快速帮助您的最好办法。 :)

0 投票
参考资料:https://clojure.atlassian.net/browse/CLJ-1141(由 akiel 报告)
0 投票

我想这可能是因为相关的接口可以在 Java 中实现。在这些实现中不会包括先决条件和后置条件,这可能会破坏假设。

by
这可以在 `defrecord` 实现上完成。它依赖于 `maybe-destructure`,遵循与 `clojure/core.clj` 中 `fn` 重新定义相似的代码路径。可以简单地将这部分代码复制粘贴。

我怀疑这会工作得很好,但我知道还有我没有考虑的边缘情况,并且可能有一些关于速度等方面的成本效益权衡。@alexmiller,有什么想法吗?
...