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 发表_

报告中存在bug:{: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 的元素是否为列表(表达式)或符号形式的 arg 绑定?其他情况多半是无效的,可能是一个错误。不确定。

0
_由 jafingerhut 发表的评论_

Eastwood 仍然会在以下代码中发出警告


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


以下是样本输出

src/filename.clj:5:22: wrong-pre-post: 找到的前置条件可能总是逻辑为真或逻辑为假。应更改为何种函数调用?pos?

即使在 Rich 发表的评论中提到值应该为向量时,它仍然会发出警告,因此在这方面过于严格,但这种严格可能并不那么糟糕。
0

由 martinklepsch 发表的评论

只想指出这个 PR(https://github.com/pedestal/pedestal/pull/544)作为一个 how this affects production Clojure code 的例子。

由于错误的 pre/post 条件被静默接受,API 实际上与库的作者意图不同。人们开始依赖这一点,并且修复损坏的前置条件本质上导致了破坏性变化。

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