2024 Cloujure调查!中分享您的想法。

欢迎!有关如何工作的更多信息,请参阅关于页面。

+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发表的评论

我阅读了你提供的(gist链接:https://gist.github.com/4471276 文本: gist)以及(Dire仓库链接:https://github.com/MichaelDrogalis/dire 文本: Dire)的README文件。我认为Erlang的监督概念有其应用之广,但我并不喜欢它对前置和后置条件的处理。对我来说,这样的条件有两个目的

  1. 它们应该记录代码,
  2. 它们应该快速失败以尽早检测到错误。

为了支持我的第一个观点,你提供的前置和后置条件在实际上距离函数定义的语法学上太远。至于第二个观点:我认为,当违反条件时,程序应该直接崩溃。也许可以用你的异常监督器对AssertionError进行包装来处理程序的一部分。但我不认为处理单个函数的前置和后置条件违反是个好主意。

0
by

由:michael-drogalis发表的评论

@Alexander的确,你的观点是正确的。Dire的目标就像你描述的那样。与应用程序逻辑在语法学上分离,并有从崩溃中恢复的机会。无论怎样,这是我帮助你快速满足需求的最佳尝试:)

0
by
0
by

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

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

我怀疑这将有效,并且效果很好,但我知道我还没有考虑到边缘情况,并且可能已经计算了速度等利弊。@alexmiller,有什么想法吗?
...