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

欢迎!请参阅关于页面以获取更多关于这个网站的信息。

+1
记录和类型

fn特殊形式和defn宏允许使用前置和后置条件。如果可以在defprotocol和deftype宏的方法声明中使用这些条件,那就太好了。

目前我使用extend函数作为替代方案,其中可以使用关键字-名称和fn特殊形式的映射来指定方法。

5个答案

0

评论者:michael-drogalis

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

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

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

0

评论者:akiel

我在https://gist.github.com/4471276和https://github.com/MichaelDrogalis/dire的README中阅读了你的内容。我认为Erlang的监督概念有其用处,但我不喜欢它用于前置和后置条件。对我来说,这样的条件有两个目的:

  1. 它们应该记录代码,
  2. 并且应该快速失败以早期检测失败。

为了支持我的第一个观点,您的先验和后验条件与实际函数定义的词汇距离太远了。对于第二个观点:我认为在违反条件的情况下,程序应该直接崩溃。也许可以用你的异常监控制度包裹程序的一部分,来处理一个AssertionError。但我不认为处理单个函数的先验和后验条件违反是一个好事。

0
by

评论者:michael-drogalis

@Alexander 的确,你的观点是正确的。Dire的意思就是你所描述的那样。从应用程序逻辑上移除,并有机会从崩溃中恢复。无论如何,这是我尽快帮助你所需做的最好的尝试。 :)

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

我怀疑这不可能实现是因为关联接口实现了Java。任何此类实现都不会包括预值和后值条件,这可能会破坏假设。

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

我怀疑这会起作用,并且效果很好,但我知道我没有考虑到某些边缘情况,并且可能有一些速度等方面的成本效益已经考虑在内。@alexmiller,有什么想法吗?
...