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

前端之家收集整理的这篇文章主要介绍了java – 与Var.intern和RT.var的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)

这可能是个错误吗?

最佳答案
这很好用:

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

猜你在找的Java相关文章