循环通过宏的args

Gab*_*ell 6 macros loops clojure multimethod

我试图在Clojure中编写一个宏,允许评估一系列简单的"def"表达式.对于宏来说,我是一个n00b.这个想法就是这样

(my-defs y1 1
     y2 "taco")
Run Code Online (Sandbox Code Playgroud)

应该扩展到

(do (def y1 1) (def y2 "taco"))
Run Code Online (Sandbox Code Playgroud)

以下代码针对两个defs的特殊情况完成了此操作

(defmacro my-defs 
  [& args]
  `(do
     (def ~(first args) ~(second args))
     (def ~(nth args 2) ~(nth args 3) )))
Run Code Online (Sandbox Code Playgroud)

这很好,但我很难概括这一点.我尝试了一些天真的事情,涉及循环通过元素的绑定,(partition 2 args)但我总是有垃圾(我知道这不是非常具体,但垃圾的多样性和范围似乎有点太多,无法在此报告).我如何循环这些并评估我的defs?

PS宏my-defs是玩具.我最终想要完成的是一个小小的帮助宏来实例化一堆多方法实例.目前我有大量的代码看起来像

(defmethod f [A B] [x] "AB")
(defmethod f [A A] [x] "AA")
(defmethod f [C B] [x] "CB")
Run Code Online (Sandbox Code Playgroud)

这有点不雅观.如果我可以做类似的事情会很好

(defmethods f
  [A B] [x] "AB"
  [A A] [x] "AA"
  [C B] [x] "CB")
Run Code Online (Sandbox Code Playgroud)

代替.

Joo*_*aat 5

在我看来,你正在寻找〜@ macro扩展/ unquote.

(defmacro defmethods [n & defs] 
   `(do ~@(map (fn [[a1 a2 a3]] 
                   `(def ~n ~a1 ~a2 ~a3)) 
               (partition 3 defs))))
Run Code Online (Sandbox Code Playgroud)