我正在尝试在 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")
反而。