2011-06-18 15 views
8

tengo que añadir varios métodos a una Clojure defprotocol que estoy escribiendo para varios componentes Swing idénticos:devolver varios valores de una clojure macro

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

¿Hay alguna manera de que puedo escribir una macro que devuelve todos tres de las firmas de método (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)) 

Esta macro tiene que añadir tres elementos a la creciente defprotocol con cada invocación.

¿Puede una macro devolver `[email protected] y expandir "en su lugar"?

Respuesta

10

Sí, solo necesita expandir su macro en un (do ...), y el compilador Clojure enhebrará los elementos do como una secuencia de formularios de nivel superior.

+0

Estoy descubriendo eso al mirar la macro 'do-template' de Stuart Sierra (http://clojure.github.com/clojure/clojure.template-api.html). Estoy experimentando con esto mientras hablamos :-). Gracias. – Ralph

1

Creo que una macro debe expandirse a una sola forma, por lo que no puede hacer esto de la manera exacta que está describiendo.

Sin embargo, no todo está perdido, ya que sin duda sería posible escribir esto con una macro en el nivel superior que se ve algo como lo siguiente:

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

que se podría utilizar de la siguiente manera:

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

Pensé en eso, pero también necesito agregar métodos adicionales al protocolo. – Ralph

Cuestiones relacionadas