TL;DR
- Clojure は Java から名前空間や var、関数に直接アクセスする Java API(
clojure.java.api.Clojureクラス)を提供している。 Clojure.varで関数を取り出してinvokeで呼び、Clojure.readでデータ構造を読み込む。clojure.core以外の名前空間はrequireで読み込む。
内容
Java から Clojure を呼び出せるように、Clojure は名前空間や var、関数に直接アクセスする Java API を提供している。
clojure.java.api.Clojure クラス
Clojure Java API の clojure.java.api.Clojure クラスは、データの読み取りや var の検索、関数呼び出しに関する静的メソッドを提供している。
Clojure.var
たとえば、+ 関数を見つけるには Clojure.var を使う。このメソッドは var の名前空間と名前を受け取り、その値(関数)を返す。また、すべての Clojure の関数インスタンスは clojure.lang.IFn インタフェースを実装しており、引数を渡して呼び出せる。
IFn plus = Clojure.var("clojure.core", "+");
System.out.println(plus.invoke(1, 2, 3);注意点として、Clojure 関数の Java インタフェースは、一般的に Object を受け取り、Object を返す。
Clojure.read
Clojure クラスは Clojure のデータ構造を文字列から読み込む read メソッドを持つ。
Object vector = Clojure.read("[1 2 3]");clojure.core 以外の名前空間を読み込む
Clojure Java API はデフォルトで clojure.core を読み込む。clojure.core 以外の名前空間を読み込む場合は、require を使う。
IFn require = Clojure.var("clojure.core", "require");
require.invoke(Clojure.read("clojure.set"));