欢迎!请查看关于页面以了解更多关于此功能的信息。
PersistentVector的equiv()函数的实现包括在比较对象上调用.size(),即便它是惰性序列。
https://github.com/clojure/clojure/blob/b8132f92f3c3862aa6cdd8a72e4e74802a63f673/src/jvm/clojure/lang/APersistentVector.java#L98
因此,像(= [1] (range))这样的谓词不会终止。在实践中,将向量与大规模部分实现的序列进行比较可能会导致它们被完全评估,而在这种情况下,我们可能会合理地期望=在第一个不匹配的元素上短路到false。
(= [1] (range))
=
false
这是否是为了更常见的用例而采取的有意权衡,在其中调用第二个参数的.size()不会带来性能成本?
有趣的是,尽管持久列表是计数集合,但这种大小比较并未在Clojure的持久列表中实现,即(= '(1) (range))会终止。
(= '(1) (range))
感谢@opqdonut在Clojurians Slack上帮助定位Java源码中的原因。
记录在https://clojure.atlassian.net/browse/CLJ-2663