Clojure和Java互操作:Java.math.BigInteger
我有一个clojure代码,它的输出是BigIntegerClojure和Java互操作:Java.math.BigInteger,java,clojure,interop,Java,Clojure,Interop,我有一个clojure代码,它的输出是BigInteger (ns com.domain.tiny (:gen-class :name com.domain.tiny :methods [#^{:static true} [binomial [int int] java.math.BigInteger]])) (defn binomial "Calculate the binomial coefficient." [n k] (let [a (inc n)]
(ns com.domain.tiny
(:gen-class
:name com.domain.tiny
:methods [#^{:static true} [binomial [int int] java.math.BigInteger]]))
(defn binomial
"Calculate the binomial coefficient."
[n k]
(let [a (inc n)]
(loop [b 1
c 1]
(if (> b k)
c
(recur (inc b) (* (/ (- a b) b) c))))))
(defn -binomial
"A Java-callable wrapper around the 'binomial' function."
[n k]
(binomial n k))
(defn -main []
(println (str "(binomial 5 3): " (binomial 5 3)))
(println (str "(binomial 10042 111): " (binomial 10042 111)))
)
作为一个独立的程序执行它,我可以毫无问题地得到结果:
(binomial 5 3): 10
(binomial 10042 111):
4906838957506814494663377752836616342 ...
48178314846156008309671682804824359157818666487159757179543983405334334410427200
我可以用leinuberjar
生成jar文件。为了从Java中使用它,我提出了以下代码
import com.domain.tiny;
import java.math.BigInteger;
public class Hello
{
public static void main(String[] args) {
BigInteger res = tiny.binomial(5, 3);
System.out.println("(binomial 5 3): " + res);
res = tiny.binomial(10042, 111);
System.out.println("(binomial 10042, 111): " + res);
}
}
不幸的是,我得到了例外
Exception in thread "main" java.lang.ClassCastException: java.lang.Long cannot be cast
to java.math.BigInteger
at com.domain.tiny.binomial(Unknown Source)
at Hello.main(Hello.java:11)
如何为Java.Math.biginger互操作clojure和Java?我可以使用:方法[#^{:static true}[二项式[int-int]double]])
和双精度=微小的二项式(10042111)代码>但不是BigInteger
这是我获取jar并执行java的步骤
lein new com.domain.tiny
copy the tiny.clj in com.domain
lein deps
lein uberjar
javac -cp .:com.domain.tiny-1.0.0-SNAPSHOT-standalone.jar Hello.java
java -cp .:com.domain.tiny-1.0.0-SNAPSHOT-standalone.jar Hello
clojure代码复制自:返回值应为clojure.lang.BigInt
Clojure代码
结果
Clojure非常酷。您是否尝试过返回java.math.BigInteger?(java.math.biginger.“123123”)
:methods [#^{:static true} [binomial [int int] clojure.lang.BigInt]]))
(defn binomial
"Calculate the binomial coefficient."
[n k]
(let [a (inc n)]
(loop [b 1
c 1]
(if (> b k)
(bigint c) ;; <-- Without this code
;; java.lang.ClassCastException:
;; java.lang.Long cannot be cast to clojure.lang.BigInt occurs
(recur (inc b) (* (/ (- a b) b) c))))))
import clojure.lang.BigInt;
...
BigInt res = tiny.binomial(10042, 111);
System.out.println("(binomial 10042, 111): " + res.toString());
java -cp .:com.domain.tiny-1.0.0-SNAPSHOT-standalone.jar Hello
>>>
(binomial 5 3): 10
(binomial 10042 111): 49068389575068144946 … 27200