6

一連の単純な「def」式の評価を可能にするマクロを Clojure で作成しようとしています。マクロに関しては、私は初心者です。アイデアは、

(my-defs y1 1
     y2 "taco")

に展開する必要があります

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

次のコードは、2 つの定義の特殊なケースでこれを実現します。

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

これはいいことですが、これを一般化するのに苦労しています。の要素のバインディングをループすることを含む単純なことをいくつか試してみましたが、(partition 2 args)常にガベージが発生しました (これはあまり具体的ではないことはわかっていますが、ガベージの多様性と範囲はここで報告するには多すぎるように思えました)。これらをループして定義を評価するにはどうすればよいですか?

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 に答える