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

欢迎!请查看关于页面,了解更多关于这个网站的信息。

0
Clojure

用其他整数类型索引向量工作正常,只有使用short int类型索引会得到错误的结果

`
(get [1 2] (int 1))

=> 2

(get [1 2] (bigint 1))

=> 2

(get [1 2] (long 1))

=> 2

(get [1 2] (short 1))

=> nil

`

这是bug吗?如果不是,原因是什么?

1 个答案

+1

如果你使用类型byte作为索引,而不仅仅是short,它也会返回nil。

发生这种事故的原因是,Clojure源文件APersistentVector.java中的valAt方法(用于在Clojure的PersistentVector类中查找值)调用了包clojure.lang.Util中的isInteger方法,以确定索引是否为整数类型。如果它的参数是java.lang.Integer、java.lang.Long、clojure.lang.BigInt或java.math.BigInteger之一,该方法返回true,对于其他类型返回false。

我不知道这被认为是bug,还是更可能是一种设计决策,以在这个热点代码路径中快速处理最常见的情况(java.lang.Long是Clojure中的默认整数类型)。

by
我认为这不是一个错误。shorts并不被视为Clojure的一个数值类型(但存在一些用于互操作的兼容性)。
by
@alexdmiller

这是什么原因呢?对于bytes来说,原因很清楚(它们存储数据),但对于shorts来说则不明显。此外,'(int? (short 1))' 返回true。
by
正如我所说的,“shorts并不被视为Clojure的数值类型之一”。
by
或者你可能想知道为什么shorts不是这个系列的一部分——Clojure关注64位数值类型——默认的是longs和doubles。提供了BigInt/BigDecimal的任意精度变体。因为某些原因,Java BigIntegers和Clojure自己BigInt版本都得到了支持(后者在与longs范围内的操作中作为longs工作,这是一个性能问题)。整数和shorts主要支持互操作。
...