Как динамически загрузить сценарий Clojure из-за пределов моего пути к классам из java?

Я хочу, чтобы пользовательские сценарии Clojure взаимодействовали с моим Java-приложением. Проблема в том, что я не знаю заранее, где будут расположены сценарии Clojure, поэтому я не могу включить их в свой путь к классам при запуске приложения.

Как динамически загрузить сценарий Clojure из-за пределов моего пути к классам?

Я пробовал простой пример:

RT.loadResourceScript("test.clj");
Var foo = RT.var("user", "foo");
Object result = foo.invoke("Hi", "there");
System.out.println(result);

с test.clj, который выглядит так:

(ns user)

(defn foo [a b]
    (str a " " b))

Но не повезло.

Я думаю, что это как-то связано с RT.makeClassLoader() или RT.baseLoader() и использованием возвращенного загрузчика для загрузки файла clojure, но я не могу заставить его работать. (Я продолжаю получать ClassNotFound) Я, вероятно, мог бы разобраться с javadoc для clojure.lang.RT, но я просто не смог их найти.


person brice    schedule 30.07.2010    source источник
comment
Да... где javadoc! #:/   -  person mike3996    schedule 28.05.2011


Ответы (2)


Попробуйте clojure.lang.Compiler.loadFile(String file)

person Stuart Sierra    schedule 30.07.2010
comment
Будет ли уместно добавить это в вики clojure? - person brice; 30.07.2010

Пока они зависят от материала в вашем пути к классам, вы можете прочитать файл как строку и оценить его,

(def content "(ns user) (defn foo [a b] (str a \" \" b))")
(map eval (read-string (str \( content \))))

read-string читает один объект из потока, поэтому вам нужно обернуть все в список, чтобы сделать его одним объектом.

person Hamza Yerlikaya    schedule 30.07.2010
comment
Спасибо, Хамза, но я звоню с Java. Я хотел бы иметь возможность сделать eval. Но без документов я просто не знаю, где метод eval. (его нет в clojure.lang.RT — я проверял) - person brice; 30.07.2010
comment
[Редактировать:] Подожди, кажется, я понял тебя. Вы имеете в виду написать файл clojure в известном месте и передать ему содержимое файла clojure, которое я хочу интерпретировать как аргумент, чтобы он возвращал то, что я хочу. Нет ли способа проще? - person brice; 30.07.2010