8

Javaコードがリフレクションを使用してClojure関数を「特別」として認識できるように、何らかの方法で特定のClojure関数にタグを付ける必要があります。関数に注釈を追加しようとしましたが、サポートされていないようです。reify(Java コードが関数オブジェクトを認識できるように)インターフェースの拡張を試みましたIFnが、Clojure は具体化されたメソッドを を実装するコードとして直接使用するのinvokeではなく、Afunction実際にメソッドを実装します (invoke実際の関数コードで実際のメソッドにタグを付ける必要があります)。

何か案は?

編集:(通常のリフレクションではなく)ASMライブラリでアクセスできる方法でタグ付けしても問題ありませんが、実際のAFunctionオブジェクトまたはinvokeメソッドに何らかの形でタグ付けする必要があります。また、実際のAFunctionオブジェクトにアクセスできません。クラスでタグを表示する必要があります。

4

2 に答える 2

3

インターフェイスを実装する任意のオブジェクトにメタデータ (マップ) をアタッチできるようにする clojure メタデータ機能を使用できIMetaます (IObj が IMeta を拡張し、すべてのオブジェクトが IObj を拡張するため、これはすべてのオブジェクトであることがわかります)。

現在、2 つのオプションがあります。

1) メタデータを var にアタッチできます (var は実際の IFn オブジェクトを指します)

(defn hello {:name "hello"} [] 10)

Java 側では、var hello を取得し、IMeta メソッドを使用してメタ データを取得し、特定のメタ データが存在するかどうかを検出します。これに関する問題は、Java コードが変数 (例: 匿名関数) ではなく IFn オブジェクトに直接アクセス/処理することである可能性があります。これを解決するには、2 番目のオプションを試してください。

2) メタデータを関数オブジェクト自体に添付します。

(def hello (with-meta (fn [] 10) {:name "hello"}))

defn変数にメタデータをアタッチすることはできません。上記のサンプル コードは、関数オブジェクト自体にメタ データを付加します。Java 側では、関数オブジェクトを IMeta に型分けし、チェックを行います。上記のコードはdefn、演習として残されているマクロの助けを借りて、もう少し好きなものにすることができます:)

于 2013-04-10T12:19:34.693 に答える