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

时间:2010-01-13 20:33:08

标签: java clojure

所以我正在尝试探索Clojure的内部结构,并且我遇到了一些我不太确定自己明白的事情:

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

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

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

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)

我收到一个错误,要求已经引用了存在的东西。这很奇怪,因为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));
}

我会做更多的挖掘,但我对这个很难过。我已经检查过了: 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)

这可能是个错误吗?

2 个答案:

答案 0 :(得分:4)

这很好用:

(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"))

答案 1 :(得分:0)

REPL只是clojure.main,所以我们不能在REPL中实习clojure.main / require,但我认为是clojure.core / require!