2011-09-05 14 views
6

私はClojureに一連の単純な "def"式の評価を可能にするマクロを書き込もうとしています。私はマクロになるとn00bです。アイデアはマクロのargsをループする

(my-defs y1 1 
    y2 "taco") 

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

次のコードは、2つのDEFS

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

の特別な場合のために、これを達成するまで拡大すべきであるということですが、私は困っ一般化を持っていますこの。私は(partition 2 args)の要素の束縛をループすることを含むいくつかの素朴なことを試しましたが、私はいつもごみを得ました(これはあまり具体的ではありませんが、ここで報告するのは多すぎると思います。どのようにこれらをループしてdefを評価するのですか?

P.S. マクロmy-defsはおもちゃです。私が実際に最終的に達成したいのは、マルチメソッドインスタンスのインスタンスを生成するためのlittelヘルパーマクロです。現在、私は少し見苦しい少しの見た目のコードの大きい塊を持っています。

(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") 

のような何かを行うことができればいいです。

答えて

5

あなたは〜@マクロ展開/引用符を探しているように見えます。

(defmacro defmethods [n & defs] 
    `(do [email protected](map (fn [[a1 a2 a3]] 
        `(def ~n ~a1 ~a2 ~a3)) 
       (partition 3 defs)))) 
+0

ありがとう、私は今defmethodsを書いた! –

+1

このパターンは、 ''( '[xyz](パーティション3 args)] ...)'や '\'(do〜@(for ...) '。マップは物事の流れを崩壊させ、逆行と'〜@ 'を使うと、コードを混乱させるようになります。 – amalloy

+0

@amalloy。もっとよく見える。 –

関連する問題