clojure宏扩展重复代码

时间:2015-06-29 05:59:40

标签: clojure macros

我很难尝试用clojure宏做一些基本的东西。我将我的例子简化为最小化。假设我有:

(def a {:i 0})

我想将b定义为:

(def b (my-func a a a a a a ... a a a a))

在编译时,我知道我想要多少a(例如3)。但是为了删除代码冗余,并且为了更好的代码,我想参数化a的数量。我想要像:

(def b (my-func (some-magic-macro 3 a)))

将扩展为

(def b (my-func a a a))

尝试使用macrodef,重复,引用等一系列事情......由于我在现阶段对clojure的理解有限而没有多少成功

谢谢大家!

1 个答案:

答案 0 :(得分:4)

当宏返回单个表单时,您无法使my-magic-macro返回my-func要使用的参数的多个副本。但是,您可以将my-func作为参数添加到my-magic-macro,并返回完整的调用:

(defmacro my-magic-macro [func arg n] `(~func ~@(repeat n arg)))