2013-02-27 23 views
5

मैं क्लोजर मैक्रो लिखने की कोशिश कर रहा हूं जिसका उपयोग संकलन समय पर एकाधिक जावा कक्षाएं उत्पन्न करने के लिए किया जाएगा। मैंने पाया है कि जब मैं मैक्रो के बाहर जेन-क्लास का आह्वान करता हूं तो मैं कक्षा में एनोटेशन जोड़ सकता हूं। हालांकि, जब मैं मैक्रो के अंदर जेन-क्लास का उपयोग करने की कोशिश करता हूं, तो संकलित कक्षा में एनोटेशन नहीं होते हैं। - मैं ग्रहण के साथ दोनों का निरीक्षण किया, और पाते हैं कि Test1 दोनों वर्ग हैजेन-क्लास का उपयोग करके क्लोजर मैक्रो एनोटेशन नहीं बनाते

(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 बनाता है:

मैं इस उदाहरण के लिए नीचे मेरी समस्या उबला हुआ -लेवल और विधि-स्तर @ डीप्रेटेड एनोटेशन, लेकिन 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)))) 
संबंधित मुद्दे