2011-06-18 98 views
8

我需要幾種方法添加到Clojure的defprotocol,我寫了幾個相同的Swing組件的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-listenerxxx-button-set-enabled,xxx-button-set-selected)?

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

該宏需要在每次調用時向增長的defprotocol添加三個項目。

宏可以返回`[email protected]並展開「到位」?

回答

10

是的,你只需要擁有您的宏在(do ...)擴張,Clojure的編譯器將線穿入do孩子的頂級形式的序列。

+0

我從Stuart Sierra的'do-template'宏中發現(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