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

欢迎!请参阅关于页面以获取更多关于如何使用该页面的信息。

+6
Clojure
已关闭

在使用一些-fn与3个谓词时,其后续评估顺序不同,并且一些-fn以不同的方式短路

使用2个谓词

((some-fn #{42} #{1}) 1 42)
=> 42

使用3个谓词

((some-fn #{42} #{1} :third-pred) 1 42)
=> 1

使用4个或更多谓词

((some-fn #{42} #{1} :third-pred :fourth+more-pred) 1 42)
=> 42

some-fn的文档字符串表示:".... 注意,f [some-fn返回的函数] 是短路的,因为它会在对原始谓词产生逻辑真值的第一个参数时停止执行。"。
我理解这仅适用于当前的3元参数行为。

可能解决方案
我认为需要修正文档字符串,将"第一个参数"替换为"一个参数"。可能需要对短路进行一致性修复的补丁,因为这可能导致返回不同的逻辑真值。

此外,此文档字符串行与"every-pred"中的行相同,"every-pred"在3参数与其2参数以及4个以上参数时具有相同的不同评估顺序和短路行为。由于"every-pred"仅返回布尔值真或假,而"some-fn"返回逻辑真值,因此这种影响较小。

已关闭并标注 fix:" 在1.11.0-alpha2中修复 "

2 答案

0

在4个或更多的谓词时,策略发生变化。不再是按照顺序测试

(p1 x))、

(p2 x))、

(p1 y)、

(p2 y)

等,而是改为

(p1 x)、

(p1 y)、

(p2 x)、

(p2 y) …

这种不一致性让我感觉像是一个错误。

3个谓词版本是对每一个谓词与arg1进行比较,然后是每一个与arg2进行比较,然后是每一个与arg3进行比较等。2和4个以上谓词版本是pred1与每个arg比较,然后pred2与每个arg比较,然后pred3与每个arg比较等。根据我的意见,文档字符串可以这样阅读(两种方式都可以),但对于非3谓词版本,实际上它在第一个

任何arg中

_谓词_为真时停止。因此,我认为3谓词版本是“错误的”,文档字符串有点误导。

0
...