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

欢迎!请参阅关于页面以了解更多该工作方式的信息。

0
错误 by
之前


user=> ((fn [x] {:pre (pos? x)} x) -5) ; ouch!
-5
user=> ((fn [x] {:pre [(pos? x)]} x) -5) ; 这才是我想的
AssertionError Assert failed: (pos? x)  user/eval4075/fn--4076 (form-init5464179453862723045.clj:1)


之后


user=> ((fn [x] {:pre (pos? x)} x) -5)
CompilerException java.lang.IllegalArgumentException: Pre and post conditions should be vectors, compiling:(NO_SOURCE_PATH:1:2)
user=> ((fn [x] {:pre [(pos? x)]} x) -5)                              
AssertionError Assert failed: (pos? x)  user/eval2/fn--3 (NO_SOURCE_FILE:2)
user=> ((fn [x] {:post (pos? x)} x) -5)
CompilerException java.lang.IllegalArgumentException: Pre and post conditions should be vectors, compiling:(NO_SOURCE_PATH:3:2)
user=> ((fn [x] {:post [(pos? x)]} x) -5)          
AssertionError Assert failed: (pos? x)  user/eval7/fn--8 (NO_SOURCE_FILE:4)


*补丁:* CLJ-1473_v03.patch
*审核过的人:* Alex Miller

11 答案

0
by

评论人:alexmiller

在错误中包含不良条件(可能通过ex-info)并将测试包括在内会很不错。

0
by

评论人: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? 评估为真(它是函数)且对于任何数字,x都评估为真。

我不确定如何继续前进。把传入的参数作为前提条件引用是完全合理且可能有用,这仅仅是一个符号。


( (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?

它也还会对 :pre 或 :post 的值不是向量发出警告,尽管Rich提出了评论,所以在这一点上它过于苛刻,但可能不是太糟糕。
0
by

评论者:martinklepsch

仅作为示例指出这个PR (https://github.com/pedestal/pedestal/pull/544) 展示了该问题如何影响实际的Clojure代码。

由于非法的预设/后置条件无声地被接受,API几乎与库作者期望的不同。人们开始依赖于此,修复损坏的预设条件实际上导致了破坏性的变更。

0
by
...