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

欢迎!有关该网站如何运作的更多信息,请参阅关于页面。

+4
集合
封闭

PersistentVector的equiv()实现涉及在要比较的对象上调用.size(),即使它是一个懒序列。

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

因此,像(= [1] (range))这样的谓词不会终止。
更实际地说,将向量与大型部分实现的序列进行比较可能会导致它们完全评估,其中人们可能合理地预期在第一个非匹配元素上,等号=将短路到false。

这是否是为了更多常见的情况而进行的故意权衡,在这种情况下,在第二个参数上调用.size()不会带来性能成本?

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

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

附带注解关闭: 已在1.11.0-alpha4中发布

1 答案

+1
...