6

我正在尝试在 Clojure 中编写一个宏,它允许评估一系列简单的“def”表达式。在宏方面,我是一个 n00b。这个想法是

(my-defs y1 1
     y2 "taco")

应该扩大到

(do (def y1 1) (def y2 "taco"))

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

(defmacro my-defs 
  [& args]
  `(do
     (def ~(first args) ~(second args))
     (def ~(nth args 2) ~(nth args 3) )))

这很好,但我无法概括这一点。我尝试了一些简单的事情,涉及循环遍历元素的绑定,(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")

这有点难看。如果我能做类似的事情就好了

(defmethods f
  [A B] [x] "AB"
  [A A] [x] "AA"
  [C B] [x] "CB")

反而。

4

1 回答 1

5

在我看来,您正在寻找 ~@ 宏扩展/取消引用。

(defmacro defmethods [n & defs] 
   `(do ~@(map (fn [[a1 a2 a3]] 
                   `(def ~n ~a1 ~a2 ~a3)) 
               (partition 3 defs))))
于 2011-09-05T22:25:05.587 回答