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

欢迎!请参阅关于 页面,以了解更多关于如何使用本站的信息。

0
错误
之前


user=> ((fn [x] {:pre (pos? x)} x) -5) ; ouch!
-5
user=> ((fn [x] {:pre [(pos? x)]} x) -5) ; 这是想要的
AssertionError 断言失败: (pos? x)  user/eval4075/fn--4076 (form-init5464179453862723045.clj:1)


之后


user=> ((fn [x] {:pre (pos? x)} x) -5)
CompilerException 编译器异常: 预和后条件应该是向量,编译:(NO_SOURCE_PATH:1:2)
user=> ((fn [x] {:pre [(pos? x)]} x) -5)                                  
AssertionError 断言失败: (pos? x)  user/eval2/fn--3 (NO_SOURCE_FILE:2)
user=> ((fn [x] {:post (pos? x)} x) -5)
CompilerException 编译器异常: 预和后条件应该是向量,编译:(NO_SOURCE_PATH:3:2)
user=> ((fn [x] {:post [(pos? x)]} x) -5)              
AssertionError 断言失败: (pos? x)  user/eval7/fn--8 (NO_SOURCE_FILE:4)


*补丁:* CLJ-1473_v03.patch
*审核人:* Alex Miller

11 答案

0

评论由: alexmiller 提供的

将错误的条件包含在错误信息(也许通过 ex-info?)中并添加测试会更好。

0

评论由: bbloom 提供的

新补丁包含测试。不幸的是,由于引导问题,不能直接调用 ex-info。因此,直接调用 ExceptionInfo 构造函数。

0
_评论由:alexmiller_提出

报告中存在错误:{:post pre} 应为 {:post post}。

测试应该改进,因为原本可以捕获这个错误。
0

评论由: bbloom 提供的

很好地抓住了预备/后置条件复制的错误。但是没有增强测试,因为那将涉及到创建一个与 fails-with-cause 兼容的版本。

0

评论由:richhickey_提出

:`pre` 和 `:post` 不需要向量,只需要集合。

0

评论由:jafingerhut_提出

Eastwood 0.2.2版本于2015年11月15日发布,将警告几种错误的预/后置条件。请参阅 https://github.com/jonase/eastwood#wrong-pre-post

目前 Eastwood 文档可能存在误导,因为它声称 `:pre` 和 `:post` 应该是向量,这与2015年10月9日 Rich 的评论相矛盾。对 Eastwood 文档的修正非常欢迎。我猜 Rich 的意图是 `:pre` 和 `:post` 可以是向量、列表或集合?在那个地方会有一个映射有意义吗?

0

评论由:marco.m_提出

有新消息吗?

0
_评论由:alexmiller_提出

Rich给出了以上的反馈,这里从未解决过。我尝试进行更新,但将约束放宽到仅“表达式集合”很有趣。一旦这样做,这里的票证的第一个示例 整数判断是否为真{:pre (整数判断是否为真 x)} 就不是无效的,它实际上是一个两件事的集合:整数判断是否为真和 x。整数判断是否为真计算为真(它是一个函数)而 x 对于任何数字都计算为真。

我不确定如何继续在这方面。将传入的参数用作前置条件是完全有效且可能有用的,这只是一个符号


( (fn [v] {:pre [v]} v) nil)  ;;前置条件应失败
( (fn [v] {:pre (v)} v) nil)  ;;同样有效


也许你可以检查 pre 或 post 的元素是列表(表达式)还是符号绑定参数?其他东西都是空洞的,可能是一个错误。不确定。

0
_由 jafingerhut 发表的评论_

Eastwood仍然是关于以下代码的警告


(defn foo [x]
  {:pre [整数判断是否为真 x]}
  (inc x))


以下是示例输出

src/filename.clj:5:22: wrong-pre-post: 前置条件似乎总是逻辑上为真或为假。 应更改为何处函数调用?  整数判断是否为真

它仍会对 :pre 或 :post 的值不是矢量发出警告,尽管 Rich 有评论,所以在这一方面过于严格,但也许并不会因此糟糕。
0

由 martinklepsch 发表的评论

只想指出这个PR(https://github.com/pedestal/pedestal/pull/544)作为如何影响生产Clojure代码的一个例子。

由于未正确形成的前后条件被静默接受,API实际上与库作者的意图不同。人们开始依赖它,并修复损坏的前置条件实际上导致了一个破坏性变更。

0
参考: https://clojure.atlassian.net/browse/CLJ-1473(由 bbloom 报告)
...