2013-02-27 23 views
5

コンパイル時に複数のJavaクラスを生成するために使用されるclojureマクロを作成しようとしています。マクロの外側でgenクラスを呼び出すと、クラスにアノテーションを追加できることがわかりました。しかし、マクロ内でgenクラスを使用しようとすると、コンパイルされたクラスには注釈がありません。genクラスを使用したclojureマクロで注釈が作成されない

私は、この例にまで私の問題を煮:

(gen-class 
    :name ^{Deprecated true} Test1 
    :prefix Test1- 
    :methods [[^{Deprecated true} getValue [] Integer]]) 

(defn Test1-getValue [] 42) 

(defmacro create-test-class [name x] 
    (let [prefix (str name "-")] 
    `(do 
     (gen-class 
     :name ~(with-meta name {Deprecated true}) 
     :prefix ~(symbol prefix) 
     :methods [[~(with-meta 'getValue {Deprecated true}) [] Integer]]) 
     (defn ~(symbol (str prefix "getValue")) [] ~x)))) 

(create-test-class Test2 56) 

私は、このファイルをコンパイルすると、それはTest1.classにしてTest2.classを作成します - 私は、Eclipseの両方を検査し、Test1のは、両方のクラスを持っていることを見つけます@Deprecated注釈がありますが、注釈のないTest2.classもあります。私はmacroexpandはを使用する場合、それは私のTest2.classが注釈を付けする必要があるかのように見えます:

user=> (set! *print-meta* true) 
true 
user=> (macroexpand '(create-test-class Test2 56)) 
(do (clojure.core/gen-class :name ^{java.lang.Deprecated true} Test2 :prefix Test2- :methods [[^{java.lang.Deprecated true} getValue [] java.lang.Integer]]) (user/defn Test2-getValue [] 56)) 

は、私がここで間違って何をしているのですか?

+0

は私が何とかClojureの内から注釈の存在をテストすることはできますか? (私はここで日食を持っていない) –

答えて

4

Meikel Brandmeyerは、ここで問題答えた: "。。マクロ内の注釈を引用({真推奨されていません}と、メタ名`)バックティックを注意してください"

https://groups.google.com/forum/#!topic/clojure/Ee1bVwcUT-c

をここで

は作業マクロです:

(defmacro create-test-class [name x] 
    (let [prefix (str name "-")] 
    `(do 
     (gen-class 
     :name ~(with-meta name `{Deprecated true}) 
     :prefix ~(symbol prefix) 
     :methods [[~(with-meta 'getValue `{Deprecated true}) [] Integer]]) 
     (defn ~(symbol (str prefix "getValue")) [] ~x)))) 
関連する問題