2009-07-25 27 views
8

Estaba practicando la escritura de macros y parece que no puedo hacer que defn funcione.¿Cómo podría escribir una macro "defn" en Clojure?

Mi sintaxis es: (my-define name parameter body)

Ignorando & parámetros y rutinas recursivas, ¿Cómo ato el nombre de un (fn cuerpo [parámetros])?

+1

puede usar 'macroexpand' ver en el repl lo que una macro se expande a. P.ej. '(macroexpand '(defn foo [] 1))'. Esto es útil tanto para depurar sus propias macros como para tratar de aprender de las macros de clojure/core. – liwp

+0

También puede usar '(fuente defn)' para inspeccionar directamente el código fuente. – dqc

Respuesta

18

Usted necesita transformar

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

a

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

Esto es bastante simple en realidad:

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

Esto no facilita las funciones con múltiples formas en el cuerpo, ni docstrings. – acron

+0

Para formularios múltiples use el operador de empalme (@) -> ~ @ body – MrOerni

Cuestiones relacionadas