2024年Clojure状态调查中分享您的看法!

欢迎!请参阅关于页面以了解有关如何使用此内容的一些更多信息。

+1投票
Records and Types

特殊的fn形式和defn宏允许前置和后置条件。如果能在一个宏的函数声明中使用该条件就更好了。

目前我使用extend函数作为解决方案,可以通过键值对指定方法。

5答案

0投票

评论由:michael-drogalis发表

使用{{:pre}}和{{:post}},在我看来,不是一个好主意。断言处理是一个两个步骤的游戏。机制需要考虑到检测和反应的部分,而后者是缺失的。

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

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

0投票

评论由:akiel发表

@Michael,我阅读了你关于(link:https://gist.github.com/4471276 文本:gist) 和(link: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,有什么看法吗?
...