2017-01-19 1 views
0

Im O'Reilly "Clojure Programmierung: Praktische Lisp für die Java-Welt", gibt es eine Erklärung:wenn 'x in clojure zu (var x) auswertet, warum sind sie nicht gleich?

Die var besondere Form tut dies:

(def x 5) 
(var x) 
;= #' user/x 

Sie‘ Ich habe schon einige Male gesehen, wie vars in der REPL: # 'gedruckt werden, gefolgt von einem Symbol. Dies ist Leser-Syntax, die zu einem Aufruf var erweitert:

#'x 
;= #' user/x 

(Kindle Standorte 1278-1282).

Dies auszuprobieren scheint nicht der Fall zu sein. Ich würde denken, dass die Typentypen die gleichen wären.

[user]> (def x 5) 
#'user/x 

[user]> (= 'x (var x)) 
false 

[user]> (type 'x) 
#<[email protected] clojure.lang.Symbol> 

[user]> (type (var x)) 
#<[email protected] clojure.lang.Var> 

[user]> 'x 
x 

[user]> (var x) 
#'user/x 
+0

'' x' ergibt '(Zitat x) ', nicht' (var x) '. '(= 'x (Zitat x))' ergibt' wahr '. 'x' ist einfach ein Symbol. Es muss sich nicht auf eine 'var' oder irgendetwas anderes beziehen. – Thumbnail

Antwort

5

Sie fehlt das # Symbol:

(def x 5) 
(spyx (var x)) 
(spyx #'x) 

(var x) => #'tst.clj.core/x 
(var x) => #'tst.clj.core/x 

Der clojure Leser die charcters in der Quelldatei verbraucht, und macht eine Substitution von #'x =>(var x), bevor es sogar an den Compiler bekommt. Wie Sie oben sehen können, sieht der spyx Makro ("Spion-Ausdruck") nicht einmal den ursprünglichen #'x Ausdruck - die Ersetzung ist bereits erfolgt.

So erhalten wir:

(= #'x (var x)) => true 

Sie können auch versuchen:

(println "type 1: " (type (var x))) 
(println "type 2: " (type #'x)) 

;=> type 1: clojure.lang.Var 
;=> type 2: clojure.lang.Var 

Wenn Sie mit den spy, spyx oder spyxx Makros spielen möchten, müssen Sie dies Ihrem hinzuzufügen project.clj:

[tupelo "0.9.19"] 
+0

Sie können den Lesezeit-Ersatz noch deutlicher demonstrieren, indem Sie die Ergebnisse der einfachen Eingabe der Eingaben untersuchen: ''[(var x) #' x]'. – amalloy

+0

ah, danke. Weißt du, ich glaube, ich war verwirrt und dachte, die # # war eine Aufforderung. – marathon

Verwandte Themen