我需要为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-listener
,xxx-button-set-enabled
,xxx-button-set-selected
)?
(defprotocol view-methods
(add-methods ok)
(add-methods cancel)
(add-methods other))
每次调用时,此宏需要向不断增长的defprotocol
添加三个项目。
宏可以返回`~@a-list
并展开“就地”吗?
答案 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))