2011-06-18 26 views
8

Birkaç aynı Swing bileşeni için yazdığım bir Clojure defprotocol'e birkaç yöntem eklemem gerekiyor:Bir clojure makrosundan birden çok değer döndürme

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

Yöntem imzalarının üçünü döndüren bir makro yazabileceğim herhangi bir yol var mı (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)) 

Bu makro, her bir çağrı ile büyüyen defprotocol'ye üç öğe eklemelidir.

Makro `[email protected] döndürüp "yerinde" genişleyebilir mi?

cevap

10

Evet, yalnızca makronuzun bir (do ...) içinde genişlemesini sağlamanız ve Clojure derleyicisinin do alt öğelerini bir üst düzey formlar dizisi olarak işleyebilmesi gerekir.

+0

Bunu, Stuart Sierra'nın "do-template" makrosuna bakarak öğreniyorum (http://clojure.github.com/clojure/clojure.template-api.html). Konuştuğumuz gibi deney yapıyorum :-). Teşekkürler. – Ralph

1

Bir makronun tek bir forma genişletmesi gerektiğine inanıyorum - böylece bunu tam olarak açıkladığınız şekilde yapamazsınız.

Ancak, tüm kesinlikle gibi görünür üst düzeyinde bir makro ile bunu yazmak mümkün olacağını, çünkü kayıp verilmez: siz kullanabilirsiniz

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

aşağıdaki gibidir:

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

Bunu düşündüm, ancak protokol için ek yöntemler eklemem gerekiyor. – Ralph

İlgili konular