我的教授讓我做這兩樣的Clojure和Java!我肯定會利用這個機會,並希望讓我的第一個Java任務調用一些Clojure代碼。在我去實際任務之前,我想創建一個簡單的工作示例。我需要你的幫助。如何調用Clojure的代碼與Java
我已閱讀關於Java/Clojure的互操作性幾個環節。 This和This。
我將使用第一個鏈接來證明什麼,我迄今所做的:
1)我已經創建了一個Clojure的項目,從現場傾倒.cli文件中,並在Eclipse中使用導出功能將它作爲.jar導出到我的Documents目錄中的文件夾。
2)我已經創建了一個第二的Java項目,甩了java文件到它,並添加了clojure.jar爲引用的庫。
Clojure的NS:
(ns com.tiny
(:gen-class
:name com.tiny
:methods [#^{:static true} [binomial [int int] double]]))
Java導入:
import com.tiny;
Java文件不承認com.tiny
。我不知道爲什麼。這些網站提到了一些有關班級路徑的內容。所以我發現在Eclipse中的類路徑編輯器,並與到的.jar的路徑添加到列表中所需的文件夾。這也沒有奏效。
我不知道我在做什麼錯。我曾經引用的罐子,把它添加到類路徑,並在第一個鏈接(除了包名)做了代碼的完整拷貝 - 粘貼。
Java代碼:
import com.tiny;
public class Main {
public static void main(String[] args) {
System.out.println("(binomial 5 3): " + tiny.binomial(5, 3));
System.out.println("(binomial 10042, 111): " + tiny.binomial(10042, 111));
}
}
的Clojure代碼:
(ns com.tiny
(:gen-class
:name com.tiny
:methods [#^{:static true} [binomial [int int] double]]))
(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)))
)
感謝您的幫助。我仍然收到「導入無法解決」的錯誤。 'Main.java'文件位於默認位置,構建路徑同時包含'clojure.jar'和'tiny.jar',並且源位於程序中最高位置。我在整個小項目上使用'export',而不僅僅是文件。我也試着將.clj文件導出爲.jar文件。我重新排列了順序,但仍然沒有任何結果。我錯過了什麼? – IAE 2011-03-28 14:41:46
@SoulBeaver:我可能會嘗試解壓其中包含Clojure代碼的.jar文件,只是爲了確保Eclipse做了正確的事情並將文件導出到適當的位置。對我來說,工作配置是:[/tiny__init.class,/com/tiny.clj,(...和一堆其他東西)]。 – roblg 2011-03-28 15:39:53