【发布时间】:2010-01-13 20:33:08
【问题描述】:
所以我正在尝试探索 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 的命名空间参数,和 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)
这可能是一个错误吗?
【问题讨论】: