欢迎!有关该网站如何运作的更多信息,请参阅关于页面。
PersistentVector的equiv()实现涉及在要比较的对象上调用.size(),即使它是一个懒序列。
https://github.com/clojure/clojure/blob/b8132f92f3c3862aa6cdd8a72e4e74802a63f673/src/jvm/clojure/lang/APersistentVector.java#L98
因此,像(= [1] (range))这样的谓词不会终止。更实际地说,将向量与大型部分实现的序列进行比较可能会导致它们完全评估,其中人们可能合理地预期在第一个非匹配元素上,等号=将短路到false。
(= [1] (range))
这是否是为了更多常见的情况而进行的故意权衡,在这种情况下,在第二个参数上调用.size()不会带来性能成本?
有趣的是,即使在Clojure的持久列表中也没有实现这种大小比较,尽管它们是计数集合,即(= '(1) (range))会终止。
(= '(1) (range))
感谢 Clojurians Slack 上的 @opqdonut 帮助确定Java源代码中的原因。
记录为 https://clojure.atlassian.net/browse/CLJ-2663