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 java.lang.IllegalArgumentException: 预先和后期条件应该是向量,编译:(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 java.lang.IllegalArgumentException: 预先和后期条件应该是向量,编译:(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 发表的评论:

很好地捕捉到了预处理/后处理的复制/粘贴错误。但没有加强测试,因为这将涉及创建一个适合 ex-info 变体的 fails-with-cause

0

评论者:richhickey

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

0

评论者:jafingerhut

https://github.com/jonase/eastwood#wrong-pre-post 东wood 0.2.2,发布于2015年11月15日,将警告关于几种不正确的预处理和后置条件。

目前 Eastwood 文档可能有误导性,因为它说 :pre 和 :post 应该是向量,这与 Rich 于2015年10月9日的评论相矛盾。这里欢迎对 Eastwood 文档的更正。我认为 Rich 的意图是 :pre 和 :post 可以是向量、列表或集合?在那里使用映射有意义吗?

0

评论者:marco.m

有什么新消息吗?

0
_评论者:alexmiller_

上面有 Rich 的反馈,但在这里从未得到解决。我尝试进行更新,但将约束放宽到只是“表达式集合”是相当有趣的。一旦这样做,这里票证的第一个示例 {:pre (pos? x)} 实际上是无效的,它是一个有两个东西的集合:pos? 和 x。pos? 评估为 true(它是一个函数)并且 x 对任何数字都评估为 true。

我不确定那个问题的前进方式是什么。将传入的参数作为前置条件引用是完全可以接受的,这只是一个符号


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


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

0
by
_由 jafingerhut 发表的评论:

Eastwood仍然会发出关于如下代码的警告


((defn foo [x]
  {:pre [pos? x]}
  (inc x))


下面是输出示例

src/filename.clj:5:22: wrong-pre-post: 前置条件总是逻辑上为真或总是逻辑上为假。 应该改为函数调用? pos?

尽管Rich有评论,但它仍然会在:pre或:post的值不是向量时发出警告,所以在这一点上过于严格,但可能不是特别糟糕。
0
by

由 martinklepsch 发表的评论:

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

由于无声地接受无效的前/后置条件,API与库作者意图的API本质上不同。人们开始依赖这一点,修复破碎的前置条件实际上导致了破坏性更改。

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