2011-06-18 15 views
8

मैं एक Clojure defprotocol है कि मैं कई समान स्विंग घटकों के लिए लिख रहा हूँ के लिए कई तरीके जोड़ने की जरूरत से एक से अधिक मान लौटने वाले:एक clojure मैक्रो

(defprotocol view-methods 
    (ok-button-add-action-listener  [this listener]) 
    (ok-button-set-enabled    [this enabled]) 
    (ok-button-set-selected   [this selected]) 
    (cancel-button-add-action-listener [this listener]) 
    (cancel-button-set-enabled   [this enabled]) 
    (cancel-button-set-selected  [this selected]) 
    (other-button-add-action-listener [this listener]) 
    (other-button-set-enabled   [this enabled]) 
    (other-button-set-selected   [this selected])) 

वहाँ किसी भी तरह से है कि मैं एक मैक्रो है कि सभी रिटर्न लिख सकते है तीन विधि हस्ताक्षर (xxx-button-add-action-listener, xxx-button-set-enabled, xxx-button-set-selected)?

(defprotocol view-methods 
    (add-methods ok) 
    (add-methods cancel) 
    (add-methods other)) 

इस मैक्रो प्रत्येक मंगलाचरण के साथ बढ़ रहा defprotocol करने के लिए तीन आइटम जोड़ने की जरूरत है।

क्या मैक्रो `[email protected] लौटा सकता है और "जगह में" विस्तार कर सकता है?

उत्तर

10

हां, आपको बस अपने मैक्रो को (do ...) में विस्तारित करने की आवश्यकता है, और क्लोजर कंपाइलर do बच्चों को शीर्ष स्तर के रूपों के अनुक्रम के रूप में थ्रेड करेगा।

+0

मुझे पता चल रहा है कि स्टुअर्ट सिएरा के 'डू-टेम्पलेट' मैक्रो (http://clojure.github.com/clojure/clojure.template-api.html) को देखने से। जैसा कि हम बोलते हैं, मैं इसका प्रयोग कर रहा हूं :-)। धन्यवाद। – Ralph

1

मेरा मानना ​​है कि एक मैक्रो को एक ही रूप में विस्तारित करना चाहिए - ताकि आप इसे सही तरीके से नहीं कर सकें।

हालांकि, सभी नहीं खोया है, क्योंकि यह निश्चित रूप से शीर्ष स्तर पर एक ऐसा मैक्रो तरह दिखता है के साथ इस लिखने के लिए संभव हो जाएगा निम्नलिखित:

(defmacro build-button-protocol [name & method-specs] 
    ....) 

कौन सा आप के रूप में इस्तेमाल कर सकते हैं इस प्रकार है:

(build-button-protocol view-methods 
    (add-methods ok) 
    (add-methods cancel) 
    (add-methods other)) 
+0

मैंने इसके बारे में सोचा, लेकिन मुझे प्रोटोकॉल में अतिरिक्त विधियों को जोड़ने की भी आवश्यकता है। – Ralph