Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Clojure与Var.intern和RT.Var的怪异_Java_Clojure - Fatal编程技术网

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

Java Clojure与Var.intern和RT.Var的怪异,java,clojure,Java,Clojure,因此,我试图探索Clojure的内部结构,我遇到了一些我不太清楚的事情: 从REPL中,我可以访问RT.var(“clojure.core”、“require”),非常好(这应该返回与“clojure.core”命名空间中的“require”符号关联的var): 但是,如果我尝试以我认为相同的方式访问它( 我得到一个错误,require已经引用了存在的东西。这很奇怪,因为RT.var与var.intern相同,只是参数分别转换为名称空间和符号 static public Var var(Stri

因此,我试图探索Clojure的内部结构,我遇到了一些我不太清楚的事情:

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

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

我得到一个错误,require已经引用了存在的东西。这很奇怪,因为RT.var与var.intern相同,只是参数分别转换为名称空间和符号

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的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)
这可能是一个bug吗?

这很好:

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

REPL只是clojure.main,所以我们不能在REPL中插入clojure.main/require,但是clojure.core/require,我想!

啊,是的……我用clojure.main代替了clojure.core。谢谢!不客气!顺便说一句,我用
Symbol/create
代替了
Symbol/intern
,但是
intern
也很有效……我想我敢打赌请在中编辑它,以免将来的访问者对这个问题感到困惑。:-)Symbol.intern()和Symbol.create()做的基本相同。最初create将使用插入字符串作为参数,但此行为已更改。里奇正在考虑在将来的某个时候去掉create()。@liwp:有趣!感谢您发布此邮件。:-)
(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"))