Как мне интегрировать GEVA в Clojure - PullRequest
2 голосов
/ 15 сентября 2010

Я вхожу в Clojure и Grammatic Evolution одновременно и обнаружил GEVA , который является инструментом GE, написанным на Java. У меня нет опыта в Java. Так что мне не нужно заново изобретать колесо, как я могу интегрировать GEVA в Clojure?

Я могу выполнить скрипт по умолчанию из CLI с: java -jar GEVA.jar -main_class Main.Run

Исходный каталог GEVA имеет следующие подкаталоги с пакетами, названными в честь каталога: Алгоритм ком Исключения FitnessEvaluation Фрактал Физические лица Главный оператор Mapper Параметр UI Util

Главный подкаталог содержит следующие файлы и учебный подкаталог: AbstractRun.java Experiment.java Run.java State.java Обучающие программы

Следующие классы находятся в файле Run.java: Открытый класс Run расширяет AbstractRun публичный Run () публичный недействительный эксперимент (String [] args) публичная настройка void (String [] args) частный void setSeed () public static void main (String [] args)

Из того, что я могу сказать, статический метод 'main' в классе Main.Run - это то, что я хочу выполнить. Однако, когда я пытаюсь следовать инструкциям взаимодействия 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)

Какого черта я делаю не так? Я уверен, что просто упускаю что-то очевидное, но я бился головой об этом некоторое время и мне нужно какое-то направление. Спасибо.

Ответы [ 3 ]

2 голосов
/ 15 сентября 2010

Во-первых, убедитесь, что вы правильно загружаете библиотеку GEVA - см. http://clojure.org/libs Я предполагаю, из ошибки java.lang.ClassNotFoundException, что GEVA отсутствует в вашем пути к классам.

Затем вы можете посмотреть документацию Clojure для взаимодействия Java: http://clojure.org/java_interop

1 голос
/ 15 сентября 2010

Синтаксис для вызова статического метода без аргументов (я буду использовать пример, к которому у всех есть доступ):

=> (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)
1 голос
/ 15 сентября 2010

У вас правильная идея, но у вас есть некоторые синтаксические ошибки.

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

Должен иметь пробел между оператором точки и ссылкой Main.Run/main. На самом деле, он пытается найти то, что называется ".Main.Run", которого, очевидно, не существует. Сделай это так:

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

Если у вас правильно настроен путь к классам, он должен работать.

Импорт класса с использованием (import ...) и вызов (main) не будут работать, потому что main является статическим методом.

...