【问题标题】:Returning multiple values from a clojure macro从 clojure 宏返回多个值
【发布时间】:2011-06-18 20:03:51
【问题描述】:

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

(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 并“就地”展开?

【问题讨论】:

    标签: macros clojure


    【解决方案1】:

    是的,您只需要将宏展开到 (do ...) 中,Clojure 编译器会将 do 子代作为一系列顶级表单进行线程化。

    【讨论】:

    【解决方案2】:

    我认为宏必须扩展为单一形式 - 因此您无法按照您所描述的方式执行此操作。

    但是,一切都没有丢失,因为它当然可以在顶层使用如下所示的宏来编写:

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

    你可以使用如下:

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

    【讨论】:

    • 我想到了,但我还需要在协议中添加额外的方法。
    猜你喜欢
    • 1970-01-01
    • 2018-08-13
    • 2011-01-03
    • 1970-01-01
    • 2012-10-04
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多