2010-09-15 38 views
2

我正在進入Clojure和語法進化的同時發現GEVA,這是一個用Java編寫的GE工具。我沒有Java的背景。所以我不必重新發明輪子,我怎樣才能將GEVA整合到Clojure中?如何將GEVA集成到Clojure中

我可以從CLI與執行默認腳本: Java的罐子GEVA.jar -main_class Main.Run

的GEVA源目錄中有目錄的名字命名包以下子目錄: 算法COM異常FitnessEvaluation分形個人主要映射操作參數UI的Util

主子目錄有下列文件和子目錄教程: AbstractRun.java Experiment.java Run.java State.java教程

以下類是在Run.java文件: 公共類潤延伸AbstractRun 公共運行() 公共無效實驗(字串[] args) 公共無效設定(字串[] args) 私人無效過setSeed() 公共靜態無效的主要(字符串[] args)

從我可以告訴,在類Main.Run靜態方法'main'是我想執行。但是,當我嘗試遵循Java互操作指令時,出現錯誤。

clgeva.test=> (.Main.Run/main) 
java.lang.Exception: No such namespace: .Main.Run (NO_SOURCE_FILE:5) 
clgeva.test=> (.Main.Run/main "") 
java.lang.Exception: No such namespace: .Main.Run (NO_SOURCE_FILE:6) 

我顯然不能正確導入命名空間來運行主函數。

user=> (import Main) 
java.lang.ClassNotFoundException: Main (NO_SOURCE_FILE:1) 
user=> (import Main.Run) 
Main.Run 
user=> (main) 
java.lang.Exception: Unable to resolve symbol: main in this context (NO_SOURCE_FILE:3) 
user=> (.Main.Run/main) 
java.lang.Exception: No such namespace: .Main.Run (NO_SOURCE_FILE:4) 

到底什麼是我做錯了什麼?我確信我只是錯過了一些明顯的東西,但我一直在嘲弄我的頭一陣子,需要一些方向。謝謝。

回答

1

用於調用靜態方法不帶參數(我將使用每個人都可以訪問的示例)的語法是:

=> (java.lang.System/currentTimeMillis) 
1284574337322 

上述形式是優選的,但以下也是可能的,並可用於宏:

=> (. java.lang.System currentTimeMillis) 
1284574477369 

在這種情況下,「java.lang。」可能會被忽略,但我將它包括在內以更緊密地與您的案例相匹配。

=> (System/currentTimeMillis) 
1284574617771 

添加點爲第一形態將無法正常工作,無論有或沒有空間:

user=> (.System/currentTimeMillis) 
java.lang.Exception: No such namespace: .System (NO_SOURCE_FILE:44) 
user=> (. System/currentTimeMillis) 
java.lang.IllegalArgumentException: Malformed member expression, expecting (. target member ...) (NO_SOURCE_FILE:45) 
+0

這個答案提供了我所做錯誤的最接近的暗示。我正確地設置了以下類: – Nick 2010-09-16 05:55:19

+0

這個答案提供了我所做錯誤的最接近的提示。當我在lib文件夾中輸入jar時,我正確地設置了以下代碼: (ns clgeva.test(:import Main.Run)) 當我搜索(ns-imports * ns *),我發現'Run Main.Run',表示該類被導入爲Run。 所以當我跑(運行/主「」),我得到了一個classCastException錯誤,這表明我是在正確的道路上。用下面的代碼解決這個問題(運行/ main(into-array [「」]))讓代碼按預期執行。 謝謝大家的幫助! – Nick 2010-09-16 06:00:38

2

首先,確保您正確加載GEVA庫 - 請參閱http://clojure.org/libs 我猜,從java.lang.ClassNotFoundException錯誤,GEVA不在您的類路徑中。

然後你想看看Clojure的文檔互操作的Java:http://clojure.org/java_interop

+0

我試着加載類路徑幾種方法。我運行的第一種方法是將GEVA.jar文件複製到leiningen lib文件夾中,然後執行'lein repl'。另一種方法是手動執行'java -cp clojure.jar:clojure-contrib.jar:GEVA.jar -jar clojure.main'。 – Nick 2010-09-15 13:22:36

+0

其實......我不是在我的機器前面......我不認爲我在之前評論的手動執行中有這種-jar。 – Nick 2010-09-15 13:24:02

+0

對於leiningen,您希望在project.clj的DEFPROJECT表單中指定GEVA作爲依賴項(例如,請參閱http://github.com/technomancy/leiningen/blob/master/project.clj)。 – 2010-09-23 06:45:50

1

你有正確的想法,但你確實有一些語法錯誤。

clgeva.test=> (.Main.Run/main) 

點運算符和Main.Run/main引用之間應該有空格。事實上,它試圖找到一種明顯不存在的名爲「.Main.Run」的東西。這樣做:

clgeva.test=> (. Main.Run/main) 

假設你有你的classpath設置正確,它應該工作。

使用(import ...)導入類並調用(main)將不起作用,因爲main是一種靜態方法。