Clojure 関数を宣言し、clojure-utils を使用して Java コードで即座に評価したいと考えています。これを行う方法?
私が使用しているコードは次のとおりです。
public static void main(String[] args) {
String s = "(defn fun[lst] (map #(/ % 2) lst))" +
"(list* (#'clojure.core/fun '(1 2 3 4 5)))";
System.out.println("Evaluating Clojure code: " + s);
Object result = mikera.cljutils.Clojure.eval(s);
System.out.println("=> " + result);
}
文字列変数s
で次の式を使用するだけで、正常に機能します。
(list* (map #(/ % 2) '(1 2 3 4 5)))
Java コンパイラは次のように表示します。
=> (1/2 1 3/2 2 5/2)
しかし、次のように、関数を宣言してからコードから呼び出しようとすると、次のようになります。
String s = "(defn fun[lst] (map #(/ % 2) lst))"
+ "(list* (fun '(1 2 3 4 5)))";
コンパイラはこれだけを表示します:
Evaluating Clojure code:
(defn fun[lst] (map #(/ % 2) lst))(list* (#'clojure.core/fun '(1 2 3 4 5)))
=> #'clojure.core/fun
更新:私はこの構造を書きました、それはひどいですが、うまくいきます:
String s =
"(do
(defn main[lst]
(defn fun[lst]
(map #(/ % 2) lst))
(list* (fun lst)))
(main '(1 2 3 4 5)))"
結果:
=> (1/2 1 3/2 2 5/2)
更新 2 (修正済み):
(do
(defn fun[lst]
(map #(/ % 2) lst))
(list* (fun '(1 2 3 4 5))))