2010-01-13 11 views
5

So Clojure Interna Ich versuche, zu erforschen und ich habe über etwas, ich bin nicht ganz sicher, ob ich verstehen:Clojure Seltsamkeit mit Var.intern und RT.var

Vom REPL kann ich RT zugreifen .var ("clojure.core", "require") ganz gut (dies soll die var mit dem "require" -Symbol in der "clojure.core" Namespace zugeordnet zurückzukehren):

user=> (clojure.lang.RT/var "clojure.core" "require") 
#'clojure.core/require 

wenn jedoch Ich versuche, es in dem, was ich dachte, war der gleiche Weg (

user=> (clojure.lang.Var/intern (clojure.lang.Namespace/findOrCreate (clojure.lang.Symbol/intern nil "clojure.main")) (clojure.lang.Symbol/intern nil "require")) 
java.lang.IllegalStateException: require already refers to: #'clojure.core/require in namespace: clojure.main (NO_SOURCE_FILE:0) 

Ich bekomme einen Fehler, der bereits auf etwas verweist, das existiert. Das ist sehr seltsam, da RT.var dasselbe wie Var.intern ist, außer dass die Argumente in einen Namespace bzw. ein Symbol konvertiert werden.

Ich werde noch etwas graben, aber ich bin ziemlich ratlos auf diesem. Ich habe bereits überprüft: 1. Null ist das gleiche wie null 2. Ich erstellt var2, die das Namespace-Argument an Var.intern gesendet wird, und var3, die das Argument Name an Var.intern zurückgegeben. Ich gebe diese beiden dann an Var.intern weiter:

user=> (clojure.lang.Var/intern 
(clojure.lang.RT/var2 "clojure.main" "require") 
(clojure.lang.RT/var3 "clojure.main" "require")) 
java.lang.IllegalStateException: require already refers to: #'clojure.core/require in namespace: clojure.main (NO_SOURCE_FILE:0) 

Könnte das ein Fehler sein?

Antwort

4

Dies funktioniert:

(clojure.lang.Var/intern 
(clojure.lang.Namespace/findOrCreate 
    (clojure.lang.Symbol/create "clojure.core")) 
(clojure.lang.Symbol/create "require")) 

Symbol/intern Werke auch:

(clojure.lang.Var/intern 
(clojure.lang.Namespace/findOrCreate 
    (clojure.lang.Symbol/intern nil "clojure.core")) 
(clojure.lang.Symbol/intern nil "require")) 
+0

AH ja ... Ich habe clojure.main anstelle von clojure.core benutzt. Vielen Dank! – Jieren

+1

Gern geschehen! Übrigens habe ich "Symbol/create" anstelle von "Symbol/intern" verwendet, aber "intern" funktioniert auch ... Ich denke, ich werde es besser bearbeiten, damit es zukünftige Besucher nicht verwirren kann. :-) –

+2

Symbol.intern() und Symbol.create() machen im Grunde dasselbe wie damals. Ursprünglich würde create interned string als Argument erwarten, aber dieses Verhalten wurde geändert. Rich dachte darüber nach, create() irgendwann in der Zukunft loszuwerden. – liwp

0

Die REPL nur clojure.main ist, so können wir nicht intern clojure.main/erfordern in einem REPL, aber clojure .core/erfordern, denke ich!