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

很好的捕捉,前/后复制/粘贴错误。但没有增强测试,因为这需要创建一个失败原因友好的变体。

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? 评估为真(它是一个函数)而对于任何数字 x,x 评估为真。

我不确定在这方面我们应该如何前进。将传入的参数称为先验条件是合理甚至可能有用的,这将仅仅是一个符号


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


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

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实际上与库作者意图的API不同。人们开始依赖于这一点,修复损坏的先验条件实质上导致了破坏性更改。

0 投票
...