Clojure gen-class にメタデータを添付することは可能ですか?
クラスに Java アノテーションを追加する必要があるライブラリを使用するサーバーを実装しようとしています。
Chas Emerick 氏らによる近刊の本「Programming Clojure」(セクション 9.7.3) では、注釈を gen クラス メソッドに追加するのは簡単ですが、クラス レベルの注釈を追加することについては言及されていません。
Clojure gen-class にメタデータを添付することは可能ですか?
クラスに Java アノテーションを追加する必要があるライブラリを使用するサーバーを実装しようとしています。
Chas Emerick 氏らによる近刊の本「Programming Clojure」(セクション 9.7.3) では、注釈を gen クラス メソッドに追加するのは簡単ですが、クラス レベルの注釈を追加することについては言及されていません。
はい、ここで素晴らしい例を見つけました:
https://github.com/clojure/clojure/blob/master/test/clojure/test_clojure/genclass/examples.clj
将来消えないようにインライン化されたコードを次に示します。
(gen-class :name ^{Deprecated {}
SuppressWarnings ["Warning1"] ; discarded
java.lang.annotation.Target []}
clojure.test_clojure.genclass.examples.ExampleAnnotationClass
:prefix "annot-"
:methods [[^{Deprecated {}
Override {}} ;discarded
foo [^{java.lang.annotation.Retention java.lang.annotation.RetentionPolicy/SOURCE
java.lang.annotation.Target [java.lang.annotation.ElementType/TYPE
java.lang.annotation.ElementType/PARAMETER]}
String] void]])
現時点ではありえないと思います。
Rich Hickey は、このスレッド https://groups.google.com/group/clojure/browse_thread/thread/d2128e1505c0c117で注釈サポートの追加について言及しています が、私が見る限り、これは deftype / defrecord のみです。もちろん、私は間違っているかもしれません。
これらの両方
(ns genclass.example
(:gen-class ^{:doc "example class"}))
と
(ns genclass.example)
(with-meta
(gen-class
:name genclass.example.ClassA
:methods [[hello [] void]])
{:doc "Example class"})
私のためにコンパイルに失敗します。例外から
Exception in thread "main" java.lang.IllegalArgumentException: Metadata can only be applied to IMetas (example.clj:4)`
これは不可能のようです。