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

欢迎!请参阅 关于 页面了解有关如何工作的更多信息。

0
错误
之前


user=> ((fn [x] {:pre (pos? x)} x) -5) ; 哎呀!
-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)
编译器异常 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)
编译器异常 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 发布

很好的一位预/后拷贝粘贴错误捕捉。但没有增强测试,因为这涉及到创建一个能够处理 fails-with-cause 的 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应该是向量,这与2015年10月9日Rich的评论相矛盾。欢迎对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已经评论过,但它仍然警告如果:预或:后的值不是一个向量,所以它在某种程度上过于严格,但这可能并不是那么不好。
0

评论由:martinklepsch发表

只是想指出这个_PULL_https://github.com/pedestal/pedestal/pull/544)作为这个如何影响生产Clojure代码的例子。

由于未正确格式化的前导/后置条件无意中被接受,API与库作者期望的API基本不同。人们开始依赖这一点,修复损坏的前导条件在很大程度上导致破坏性更改。

0
...