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

欢迎!请查看关于页面以了解更多关于此功能的信息。

+4
Collections
关闭

PersistentVector的equiv()函数的实现包括在比较对象上调用.size(),即便它是惰性序列。

https://github.com/clojure/clojure/blob/b8132f92f3c3862aa6cdd8a72e4e74802a63f673/src/jvm/clojure/lang/APersistentVector.java#L98

因此,像(= [1] (range))这样的谓词不会终止。
在实践中,将向量与大规模部分实现的序列进行比较可能会导致它们被完全评估,而在这种情况下,我们可能会合理地期望=在第一个不匹配的元素上短路到false

这是否是为了更常见的用例而采取的有意权衡,在其中调用第二个参数的.size()不会带来性能成本?

有趣的是,尽管持久列表是计数集合,但这种大小比较并未在Clojure的持久列表中实现,即(= '(1) (range))会终止。

感谢@opqdonut在Clojurians Slack上帮助定位Java源码中的原因。

附带说明关闭: 发布在1.11.0-alpha4中

1 答案

+1
...