请在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 发表的评论:

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

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
_评论由: jafingerhut_发表

Eastwood仍然会警告如下代码


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


以下是示例输出

src/filename.clj:5:22: wrong-pre-post: 预先条件总是逻辑上正确或总是逻辑上错误的。  应该改为函数调用?  pos?

即使在 Rich 的评论之后,如果 :pre 或 :post 的值不是向量,它仍然会发出警告,因此在这一点上过于严格,但也许很好。
0

评论由: martinklepsch

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

由于不规范的先决条件/后置条件默默地被接受,API实质上与库作者意图不同。人们开始依赖这种方式,修复损坏的先决条件实质上导致了一个破坏性的更改。

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