2009-07-25 12 views
8

私はマクロを書く練習をしていましたが、defnを動作させることができません。Clojureで "defn"マクロを書くにはどうすればよいですか?

私の構文は次のとおりです。(my-define name parameter body)

は&パラメータと再帰的なルーチンを無視して、どのように私は(FN [パラメータ]体)に名前をバインドしていますか?

+1

あなたはどのようなマクロREPLで見るために 'macroexpand'を使用することができますに拡大する。例えば。 '(macroexpand '(defn foo [] 1))'となります。これは、独自のマクロのデバッグと、クロージャー/コアマクロからの学習の両方に役立ちます。 – liwp

+0

'(source defn)'を使ってソースコードを直接検査することもできます。 – dqc

答えて

18

あなたは、これは実際には非常に簡単です

(def <name> (fn <args> <body>)) 

(my-define <name> <args> <body>) 

を変換する必要があります。

(defmacro my-define [name args body] 
    `(def ~name (fn ~args ~body))) 
+2

これは、本文中に複数の形式を持つ関数やドキュメントストリングを容易にするものではありません。 – acron

+0

複数のフォームの場合、スプライス演算子(@) - >〜@ body – MrOerni

関連する問題