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的应用版

0

由 richhickey 添加的评论:

:pre 和 :post 不需要向量,只需要集合。

0

由 jafingerhut 添加的评论:

Eastwood 0.2.2版本,发布于2015年11月15日,将警告几种不正确的预/后条件。请参见 https://github.com/jonase/eastwood#wrong-pre-post

Eastwood的文档可能目前有些误导,因为它说:pre 和 :post 应该是向量,这与richhickey 2015年10月9日的评论相冲突。欢迎在此对Eastwood的文档进行更正。我认为richhickey的意图是:pre 和 :post 可以是向量、列表或集合?在那里使用映射是否有意义?

0

由 marco.m 添加的评论:

有什么新消息吗?

0
_由 alexmiller 添加的评论:

Rich在此之前的反馈尚未得到解决。我试着进行了一次更新,但将约束放宽为“表达式集合”是有点有趣的。一旦这样做,这里的第一个示例 {:pre (pos? x)} 实际上不是无效的,它是一个包含两个东西的集合:pos? 和 x。pos? 计算为true(它是一个函数)并且x对任何数字都计算为true。

我不确定在这种情况下如何前进。将传入的参数作为先决条件(仅仅是一个符号)引用是 perfectly valid 和甚至可能有用。


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


可能你需要检查 pre 或 post 的元素是否是列表(表达式)或符号的参数绑定?其他任何东西都可能是空集,可能是一个 bug。不确定。

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 发布:

我只是想指出这个 pull request (https://github.com/pedestal/pedestal/pull/544) 作为这种情况对生产 Clojure 代码影响的示例。

由于非法的 pre/post 条件被默默接受,API 实际上与库作者意图的差异很大。人们开始依赖它,修复破损的先决条件本质上导致了不兼容的更改。

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