2011-06-18 11 views
8

muszę dodać kilka metod do Clojure defprotocol że piszę dla kilku identycznych komponentów SwingZwracanie wielu wartości z Clojure makro

(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])) 

Czy jest jakiś sposób, że mogę napisać makro, które zwraca wszystkie trzy z sygnatur metody (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)) 

To makro musi dodać trzy pozycje do rosnącej defprotocol z każdym wywołaniu.

Czy można zwrócić makro `[email protected] i rozwinąć "na miejscu"?

Odpowiedz

10

Tak, wystarczy, że makro zostanie rozwinięte w (do ...), a kompilator Clojure będzie łączyć wątki do jako sekwencję formularzy najwyższego poziomu.

+0

Odkrywam to patrząc na makra 'do-template' Stuarta Sierra (http://clojure.github.com/clojure/clojure.template-api.html). Eksperymentuję z nim, gdy mówimy :-). Dzięki. – Ralph

1

Uważam, że makro musi rozwinąć się do pojedynczego formularza - nie można tego zrobić dokładnie w taki sposób, jak opisujemy.

Jednak nie wszystko jest stracone, ponieważ z pewnością byłoby możliwe napisanie tego z makra na najwyższym poziomie, który wygląda mniej więcej tak:

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

które można użyć w następujący sposób:

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

Pomyślałem o tym, ale muszę również dodać dodatkowe metody do protokołu. – Ralph

Powiązane problemy