欢迎!请参阅 关于 页面以了解此处的更多信息。
使用 int 是一个故意的设计算法还是失误?
int
www.server=> (count (range 0 2147483647)) 2147483647 www.server=> (count (range 0 2547483647)) ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)
是的,这是个故意的决定——Clojure 跟随 Java,其中使用基于 int 的计数(而且由于 Java 接口,我们在这方面的集合 size() 方法实现中有点受限)。他们已经在讨论了几年的方法来克服这个限制(尤其是对于数组),但它已经嵌入到很多地方。
我上次在处理 range 实际情况时,我研究了一下,计划最终将计数函数改为基于 long。这似乎是可行的,并且应该在进行大多数情况下不会造成破坏性的变化,但我还没有进行深入的分析。持久化集合的 size() 方法仍将是基于 int 的,但我们有自己的基于 long 的方法,并可以让计数使用这些方法。
有关此问题有一个跟踪报告https://clojure.atlassian.net/browse/CLJ-1729(并在 ask 中的https://ask.clojure.org/index.php/1527/make-counted-and-count-return-long-instead-of-integer)。实际上,在集合中拥有超过 Integer.MAX_VALUE 项的情况非常罕见,所以这很少是一个真正的问题。