2012-08-03 9 views
32

ich die clojure Quelle graste und ich war von der Art und Weise überrascht das, wenn Makro definiert:clojure wenn Makro

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=> 

Ich hatte erwartet, es so etwas wie dies stattdessen geschrieben werden:

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

Warum wurde das eigentliche Makro auf diese weniger übliche Weise geschrieben?

Antwort

67

core.clj wird von Anfang bis Ende erstellt, beginnend mit dem, was Java bietet, und um alle Anforderungen für Clojure zu erfüllen. Wenn when definiert ist, existiert das Syntax-Zitat noch nicht.
Das when Makro wird auf line 456 von core.clj definiert und die Voraussetzungen für die Syntax-quote sind nicht verfügbar, bis line 682.die als Makro-Syntax

+4

Ich wünschte, ich hätte mehr up-Stimmen zu definieren zitiert, dies zu geben . –

+1

Zeile 680 scheint das Defmulti-Makro zu sein. Und Syntax-Zitat (ich nehme an) ist ein Leser-Makro. Können Sie genauer erläutern, welche Funktion/Makro für das Syntax-Zitat benötigt wird? – Kevin

+0

Kevin, warum folgst du nicht einfach den Links hinter diesen Zeilennummern? Es gibt kein 'defmulti' bei oder in der Nähe von Zeile 682, also schauen Sie sich wahrscheinlich eine andere Version dieser Datei an. Was für Syntaxzitat erforderlich ist, ist einfach: ** alles definiert über Zeile 682 ** in dieser bestimmten Version der Datei. –