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报告)
...