2014-01-23 8 views
5

i tatsächlich clojure und insbesondere Symbolein clojure Sprache <'a> wirklich, was ist

(def a 1) 
(type a) 
;;=>java.lang.Long 
(type 'a) 
;;=>clojure.lang.Symbol 

Ich weiß, perfekt zu verstehen versuche, dass type eine Funktion ist, so erhalten ausgewertet seine Argumente zuerst, damit ich vollkommen verstehen, warum der Code über Arbeit auf diese Weise .In den fließenden Code habe ich beschlossen, mit, dass die Auswertung unter Verwendung des Makro

(defmacro m-type [x] (type x)) 
(m-type a) 
;;==>clojure.lang.Symbol 

, und ich bin in Ordnung zu verzögern, aber ich kann nicht, was uderstand ist dies:

(m-type 'a) 
;;=>clojure.lang.Cons 

, warum die Art von ‚a a cons ist

+1

Benutzer, der als „zu breit“ schließen gestimmt können Sie rechtfertigen deine Entscheidung? Dies hat eine konkrete und einfache Antwort – jozefg

+0

Vielleicht hat nur jemand den Titel gelesen? –

Antwort

6

das Zeichen‘ durch den clojure Leser als Leser-Makro, das auf eine Liste erweitert interpretiert wird das Symbol quote enthält, gefolgt von was auch immer folgt die‘, so in Ihren Anruf (m-type 'a) die 'a expandiert zu:

user> (macroexpand-1 ''a) 
(quote a) 

dann ruft Typ auf der Liste (quote a) die ein Cons ist.

Dies kann ein bisschen mehr klar sein, wenn wir den m-Typ Makro-Druck die Argumente machen, wie es sie sieht, während er die Bewertung:

user> (defmacro m-type [x] (println "x is " x) (type x)) 
#'user/m-type 
user> (m-type 'a) 
x is (quote a) 
clojure.lang.Cons 
+1

Ich denke, das OP wird immer noch durch das Ergebnis von verwirrt sein (Typ 'a) - der Anruf ohne Makro - – Chiron

+1

Das ist ein guter Punkt, gibt es sowohl Makro-Erweiterung und Zitate bei diesem Spiel. –

+1

Wahrscheinlich wird er wieder fragen, warum (Typ 'a) clojure.lang.Symbol zurückgibt. Aber ich bin kein Illusionist! – Chiron