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

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

0
错误
之前


user=> ((fn [x] {:pre (pos? x)} x) -5) ; ouch!
-5
user=> ((fn [x] {:pre [(pos? x)]} x) -5) ; meant this
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] {:post (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日发布,将警告几种不正确的 pre 和 post 条件。见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
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 实质上与库作者期望的不同。人们开始依赖这个,修复有问题的先决条件在本质上是导致破坏性更改。

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