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而导致的。任何这样的实现都不会包括预条件和后条件,这可能会打破假设。

可以在 `defrecord` 实现上做到这一点。它依赖于 `maybe-destructure`,遵循与 `clojure/core.clj` 中 `fn` 重新定义的类似代码路径。可以直接复制粘贴。

我怀疑这会适用且效果很好,但我知道我还没有考虑到的边缘情况,可能还有一些关于速度等的成本效益需要考虑。@alexmiller,有什么想法吗?
...