2009-07-25 21 views
8

Mi stavo esercitando a scrivere macro e non riesco a far funzionare defn.Come posso scrivere una macro "defn" in Clojure?

La mia sintassi è: (my-define name parameter body)

Ignorando & parametri e le routine ricorsive, Come faccio lego il nome ad un (fn [parametri] corpo)?

+1

È possibile utilizzare 'macroexpand' vedere nel repl quello che una macro si espande a. Per esempio. '(macroexpand '(defn foo [] 1))'. Ciò è utile sia nel debug dei propri macro, sia nel tentativo di imparare dalle macro clojure/core. – liwp

+0

Può anche usare '(source defn)' per ispezionare direttamente il codice sorgente. – dqc

risposta

18

Avrete bisogno di trasformare

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

a

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

Questo è abbastanza semplice in realtà:

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

Ciò non facilita le funzioni con più forme nel corpo, né docstring. – acron

+0

Per più moduli utilizzare l'operatore di giunzione (@) -> ~ @ corpo – MrOerni

Problemi correlati