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

欢迎!请查看关于页面以了解更多关于此网站的工作方式的信息。

0票数
Clojure

使用int是故意的还是疏忽的?

www.server=> (count (range 0 2147483647))
2147483647
www.server=> (count (range 0 2547483647))
ArithmeticException integer overflow  clojure.lang.Numbers.throwIntOverflow 
(Numbers.java:1501)

1 答案

+2票数

是的,这是故意的 - Clojure遵循Java,Java使用基于int的计数(并且由于Java接口的限制,我们在集合的size()方法实现中也多少有点被迫这样做)。他们谈论了几年如何突破这个限制(尤其是对于数组),但它已经深深植根于许多地方。

在上次我真正工作在range上的时候,我对此进行了一些研究,计划最终让计数函数基于long。这在大多数情况下看起来是可行的,应该是一个非破坏性的更改,但我还没有进行过认真的分析。持久的集合size()方法仍然基于int,但我们可以拥有自己的基于long的方法,并用这些方法代替count。

有关跟踪此事的问题单在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项目的情况很少见,所以这很少成为一个真正的问题。

...