2016-10-23 4 views
2

Clojure関数でJavaリフレクションメソッドを使用したいと思います。 (.toString {:a 1})のようなコードは、clojureリーダーで解析しコンパイルすると思います。したがって、clojureマクロを使用して動作します。しかし、実行時にjavaオブジェクトメソッドを呼び出す関数を定義したい場合は失敗します。私はclojureでこの種のコードをどのように呼び出すのか分かりません。ここで実行時にjavaメソッドを呼び出すclojureコードを生成するにはどうすればよいですか?

は私のデモコードです:

(def jmethod ".toString") 
(defn call-java-method [mname & body] 
    (let [fn1 (fn [] `(~(symbol mname) [email protected]))] 
     (fn1))) 

user=> (call-java-method jmethod 3.4M) 

結果がリスト(.toString 3.4M)ですが、私はClojureの関数呼び出しとしてこのリストをevalにしたいです。

答えて

1

マクロはコンパイル時に動作するので、本質的にマクロを使用して動的に解決されたメソッドを呼び出すことはできません。

あなたは2つのオプションがあります:

  1. それを実行して、あなたのコードをコンパイルするために、ランタイム・コンパイラとしてのClojureを使用して構成されていたJava Reflection API
  2. 使用clojure.core/evalを使用します。
関連する問題