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

欢迎!有关如何使用本服务的信息,请参阅关于页面。

+6
Clojure
已关闭

使用some-fn与3个谓词时,其评估顺序不同,且some-fn的短路方式也不同于使用2个谓词时

在使用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"返回逻辑真值,因此此处的副作用较小。

已关闭,备注: 已修复在1.11.0-alpha2中

2 答案

0
by

当有4个或以上的谓词时,策略会改变。不再是按照顺序测试 (p1 x), (p2 x), (p1 y), (p2 y) 等,而是切换到 (p1 x), (p1 y), (p2 x), (p2 y) ...

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

by
3个谓词版本逐个对arg1进行检查,然后对arg2进行检查,然后对arg3进行检查等。2个和4个以上谓词版本先对pred1对每个arg进行检查,然后对pred2对每个arg进行检查,然后对pred3对每个arg进行检查等。文档字符串可以从两种方式阅读(据我观察)但对非3个谓词版本来说,它实际上在第一个任何arg中返回truthy的 predicate 时停止。所以我认为3个谓词版本是“错误的”,而文档字符串有些误导。
0
by
...