2009-08-11 17 views
2

私はClojureのマクロを勉強していて、 "cond"マクロを書こうとしていました。ClojureでCond Macroを書くのを助けてください。

(条件)(引数)への引数の構造化を解除し、再帰的なマクロを書き込む際に問題が発生しました。

私を助けてください。

答えて

4

私はプロセスを説明するためにこれを書いています。このコードには多くのバグがありますが、できるだけ速やかに面白い部分を手に入れることができます:) マクロへの呼び出しを書き出し、その呼び出しを何に変換するか(この手順はオプションではありません)

それは

(defmacro my-cond [test result] `(if ~test ~result nil)) 

(macroexpand-1 '(my-cond (even? 4) 42) ==> (if (even? 4) 42) 

と一致するまで

(my-cond (even? 4) 42 (odd? 4 24)) 

(if (even? 4) 42 (if (odd? 4) 24))) 
は、今ではより一般的にする最も簡単なケースのためのテンプレートを作成した後、(macroexpandは-1 ...)にそれを餌とひねり

(defmacro my-cond [& cases] 
    `(if (if ~(first cases) ~(second cases) ~(my-cond (drop 2 cases)) 

を入力して、マクロエクセル-1でマクロエクセルで再生し(「-1」を除いて)、完全に正しいケースに展開されていることを確認してください。
次に、奇数用語など...

次にcore.cljを見て、どれくらい近づいたかを見てください。

関連する問題