2009-07-25 11 views
8

Ćwiczyłem pisanie makr i nie mogę sprawić, że zadziała defn.Jak mogę napisać makro "defn" w Clojure?

Moja składnia jest następująca: (my-define name parameter body)

Ignorując & parametry i procedury rekurencyjne, Jak mogę powiązać nazwę na (FN [parametr] ciała)?

+1

Można użyć 'macroexpand' zobaczyć w repl co makro rozwija się do. Na przykład. '(macroexpand '(defn foo [] 1))'. Jest to przydatne zarówno przy debugowaniu własnych makr, jak i przy próbie uczenia się z makr clojure/core. – liwp

+0

Może również użyć '(source defn)' do bezpośredniego sprawdzenia kodu źródłowego. – dqc

Odpowiedz

18

Trzeba będzie przekształcić

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

do

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

Jest to dość prosta rzeczywiście:

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

To nie ułatwia funkcji z wieloma formularzami w ciele ani docstrukcji. – acron

+0

Dla wielu formularzy użyj operatora splicingu (@) -> ~ @ body – MrOerni

Powiązane problemy