2012-08-03 21 views
32

estaba navegando por la fuente clojure y me sorprendió por la forma en la que la macro se define:clojure cuando macro

user=> (source when) 
(defmacro when 
    "Evaluates test. If logical true, evaluates body in an implicit do." 
    {:added "1.0"} 
    [test & body] 
    (list 'if test (cons 'do body))) 
nil 
user=> 

que estaba esperando a ser escrito algo como esto en su lugar:

(defmacro when [test & body] `(if ~test (do [email protected]))) 

¿Por qué se escribió la macro actual de esta manera menos habitual?

Respuesta

67

core.clj está construido de arriba a abajo, comenzando con lo que proporciona Java y desarrollando todos los requisitos para Clojure. Cuando se define when, la cita de sintaxis aún no existe.
La macro when se define en line 456 de core.clj y los requisitos para la sintaxis de cotización no están disponibles hasta line 682.la macro cuando se utiliza para definir la sintaxis citando

+4

Me gustaría tener más arriba-votos a dar este . –

+1

La línea 680 parece ser la macro defmulti. Y la cita de sintaxis (supongo) es una macro de lector. ¿Puede explicar exactamente qué función/macro se requiere para la cita de sintaxis? – Kevin

+0

Kevin, ¿por qué no sigues los enlaces detrás de esos números de línea? No hay 'defmulti' en la línea 682 o cerca de ella, por lo que probablemente esté buscando alguna otra versión de este archivo. En cuanto a lo que se requiere para la cita de sintaxis, es simple: ** todo lo definido anteriormente en la línea 682 ** en esta versión particular del archivo. –

Cuestiones relacionadas