从clojure宏返回多个值

时间:2011-06-18 20:03:52

标签: macros clojure

我需要为Clojure defprotocol添加几个方法,我正在编写几个相同的Swing组件:

(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-enabledxxx-button-set-selected)?

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

每次调用时,此宏需要向不断增长的defprotocol添加三个项目。

宏可以返回`~@a-list并展开“就地”吗?

2 个答案:

答案 0 :(得分:10)

是的,您只需要在(do ...)中扩展宏,Clojure编译器就会将do子项作为一系列顶级表单进行处理。

答案 1 :(得分:1)

我认为宏必须扩展为单个表单 - 因此您无法以您描述的方式执行此操作。

但是,所有这些都不会丢失,因为在顶层使用宏来编写这个内容肯定是可能的,如下所示:

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

您可以使用以下内容:

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