Я вызываю Clojure из Java и вызываю eval
для переданной строки. Код Java будет содержать объекты, а клиентский код может указывать строки кода Clojure для запуска на объекте. Я знаю, как вызывать код Clojure из Java, но как передать переменную в?
Вот что у меня есть. Во-первых, простой объект для работы:
public class Helloer {
public String getGreeting() { return "Hello"; }
}
Затем некоторый шаблонный код для вызова метода Clojure.
public static String call(Helloer helloer, String expression) throws Exception {
RT.loadResourceScript("EvalObject.clj");
final Var schrodEval = RT.var("eval-object", "eval-string");
final String result = (String) schrodEval.invoke(expression, helloer);
return result;
}
Но потом я застреваю в коде Clojure. Объект передается в порядке, но как передать значение в eval
?
Вот что я пробовал:
(ns eval-object)
(defn eval-string [string this]
(eval (read-string string)))
(defn eval-string2 [string value]
(def this)
(binding [this value]
(eval (read-string string))))
(defn eval-string3 [string value]
(def this)
(eval (list 'binding (vector 'this 5) (read-string string))))
Они дают:
java.lang.Exception: Unable to resolve symbol: this in this context (NO_SOURCE_FILE:0)
Итак, я попытался создать связующее предложение, которое определяет this
:
(defn eval-string4 [string value]
(def this)
(eval (list 'do (list 'defonce 'this nil)
(list 'binding (vector 'this value) (read-string string)))))
Но теперь я получаю:
java.lang.RuntimeException: Can't embed object in code, maybe print-dup not defined: Helloer@638bd7f1 (NO_SOURCE_FILE:0)
Я что-то упустил? Можно ли передавать объекты из Java в Clojure и в eval?