我正在尝试在Clojure中编写一个宏,它允许评估一系列简单的“def”表达式。对于宏来说,我是一个n00b。这个想法是
(my-defs y1 1
y2 "taco")
应扩展为
(do (def y1 1) (def y2 "taco"))
以下代码针对两个defs的特殊情况
完成此操作(defmacro my-defs
[& args]
`(do
(def ~(first args) ~(second args))
(def ~(nth args 2) ~(nth args 3) )))
这很好,但我很难概括这一点。我尝试了一些天真的事情,涉及循环通过(partition 2 args)
的元素的绑定,但我总是垃圾(我知道这不是非常具体,但垃圾的多样性和范围似乎有点太多,无法在此报告)。我如何循环这些并评估我的defs?
P.S。
宏my-defs
是一个玩具。我最终想要完成的是一个小小的帮助宏来实例化一堆多方法实例。目前我有大量的代码看起来像
(defmethod f [A B] [x] "AB")
(defmethod f [A A] [x] "AA")
(defmethod f [C B] [x] "CB")
这有点不雅观。如果我可以做像
那样的事情会很好(defmethods f
[A B] [x] "AB"
[A A] [x] "AA"
[C B] [x] "CB")
代替。
答案 0 :(得分:5)
在我看来,你正在寻找〜@ macro扩展/ unquote。
(defmacro defmethods [n & defs]
`(do ~@(map (fn [[a1 a2 a3]]
`(def ~n ~a1 ~a2 ~a3))
(partition 3 defs))))