如何将GEVA集成到Clojure中

时间:2010-09-15 06:16:56

标签: java interop clojure

我同时进入Clojure和Grammatical Evolution并发现了GEVA,这是一个用Java编写的GE工具。我没有Java背景。所以我不必重新发明轮子,我怎样才能将GEVA整合到Clojure中?

我可以使用以下命令从CLI执行默认脚本:     java -jar GEVA.jar -main_class Main.Run

GEVA源目录包含以下子目录,其中包以目录命名: 算法com例外FitnessEvaluation分形个体主映射运算符参数UI Util

Main子目录包含以下文件和教程子目录: AbstractRun.java Experiment.java Run.java State.java教程

以下类位于Run.java文件中:     公共类Run扩展AbstractRun         public Run()         public void experiment(String [] args)         public void setup(String [] args)         private void setSeed()         public static void main(String [] 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)

我显然没有正确导入命名空间来运行main函数。

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)

我到底做错了什么?我确信我只是遗漏了一些显而易见的东西,但我一直在敲打它一段时间并需要一些方向。感谢。

3 个答案:

答案 0 :(得分:2)

首先,确保正确加载GEVA库 - 请参阅http://clojure.org/libs 我猜测,从java.lang.ClassNotFoundException错误,GEVA不在你的类路径上。

然后,您想查看Java interop的Clojure文档:http://clojure.org/java_interop

答案 1 :(得分:1)

你有正确的想法,但确实有一些语法错误。

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

点运算符和Main.Run / main引用之间应该有一个空格。事实上,它试图找到一种名为“.Main.Run”的东西,它显然不存在。这样做:

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

假设您正确设置了类路径,它应该可以正常工作。

使用(import ...)导入课程并调用(main)将无效,因为main是一种静态方法。

答案 2 :(得分: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)