【发布时间】:2013-08-02 16:29:24
【问题描述】:
我正在寻找有关何时在 Clojure 中使用 Clojure BigInt 与 Java BigInteger 的指导。两者都工作得很好,我假设使用 BigInt 的主要原因是利用像 + 和 = 这样的运算符,它们必须通过 Java 实例方法 .add 和 .equals 访问,例如实例。但是很少有操作符,比如isProbablePrime,我只能从BigInteger访问。
从 BigInt 转换到 BigInteger 似乎很容易,反之亦然,但是两者的存在使我不清楚用例。我的下意识反应就是在没有明确标准的情况下坚持使用 BigInteger,因为一些建议的用法似乎不起作用。来自clojuredocs here:
user=> (def x (bigint 97))
user=> (.isProbablePrime x 1)
IllegalArgumentException No matching method found: isProbablePrime for class
clojure.lang.BigInt clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)
【问题讨论】:
-
查看 BigInt (github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/…) 的源代码后,BigInt 似乎包含 java.math.Bigint 和 long。在 Clojure 网页上,它说 BigInts 在所有操作中保持其类型。考虑到您可以使用 .toBigInteger 和 .fromBigInteger 轻松转换,以防您想使用 isProbablePrime 之类的方法,并且考虑到构造为 java.math.BigInteger 并不容易,我会坚持使用 bigint 并进行转换必要时返回(BigInts 自己执行此操作,例如在 .add 中)。
-
其实是
clojure.lang.BigInt/fromBigInteger;我在这里添加了一个示例clojuredocs.org/clojure_core/clojure.core/bigint
标签: clojure