所以我正在尝试探索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)
这可能是个错误吗?
最佳答案
这很好用:
(clojure.lang.Var/intern
(clojure.lang.Namespace/findOrCreate
(clojure.lang.Symbol/create "clojure.core"))
(clojure.lang.Symbol/create "require"))
符号/实习生也有效:
(clojure.lang.Var/intern
(clojure.lang.Namespace/findOrCreate
(clojure.lang.Symbol/intern nil "clojure.core"))
(clojure.lang.Symbol/intern nil "require"))