Clojure weirdness with Var.intern and RT.var

So, I'm trying to learn the internal elements of Clojure, and I came across the fact that I'm not quite sure that I understand:

From REPL, I can access RT.var ("clojure.core", "require") just fine (this should return the var associated with the "require" character in "clojure". Core "):

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

However, if I try to access it in what I thought was the same (

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)

I get an error that requires already applies to what exists. This is very strange because RT.var is the same as Var.intern, with the exception of arguments converted to a namespace and a character, respectively.

static public Var var(String ns, String name){
    return Var.intern(Namespace.findOrCreate(Symbol.intern(null, ns)), Symbol.intern(null, name));
}

, . : 1. nil - , null 2. var2, , Var.intern, var3, , Var.intern. Var.intern:

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)

?

+5
2

:

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

Symbol/intern :

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

REPL - clojure.main, clojure.main/require REPL, clojure.core/require, !

0

All Articles