1

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))))
4

2 に答える 2