与Var.intern和RT.var的Clojure怪异

Jie*_*ren 5 java clojure

所以我正在尝试探索Clojure的内部,我遇到了一些我不太确定的理解:

从REPL中,我可以正常访问RT.var("clojure.core","require")(这应该返回与"clojure.core"命名空间中的"require"符号相关联的var):

user=> (clojure.lang.RT/var "clojure.core" "require")
#'clojure.core/require
Run Code Online (Sandbox Code Playgroud)

但是,如果我试图以同样的方式访问它(

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)
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,需要已经引用存在的东西.这很奇怪,因为RT.var与Var.intern相同,除了参数分别转换为Namespace和Symbol.

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

我会做更多的挖掘,但我对这个很难过.我已经检查过:1.nil与null相同2.我创建了var2,它返回发送给Var.intern的namespace参数,var3,它返回发送给Var.intern的name参数.然后我将这两个传递给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)
Run Code Online (Sandbox Code Playgroud)

这可能是个错误吗?

Mic*_*zyk 4

这工作正常:

(clojure.lang.Var/intern
 (clojure.lang.Namespace/findOrCreate
  (clojure.lang.Symbol/create "clojure.core"))
 (clojure.lang.Symbol/create "require"))
Run Code Online (Sandbox Code Playgroud)

Symbol/intern还可以工作:

(clojure.lang.Var/intern
 (clojure.lang.Namespace/findOrCreate
  (clojure.lang.Symbol/intern nil "clojure.core"))
 (clojure.lang.Symbol/intern nil "require"))
Run Code Online (Sandbox Code Playgroud)

  • 如今,Symbol.intern() 和 Symbol.create() 基本上做同样的事情。最初 create 期望 interned 字符串作为参数,但此行为已更改。Rich 正在考虑在未来的某个时候摆脱 create() 。 (2认同)