gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:16:22 25 4
gpt4 key购买 nike

所以我正在尝试探索 Clojure 的内部结构,但我遇到了一些我不太确定自己是否理解的事情:

从 REPL,我可以很好地访问 RT.var("clojure.core","re​​quire")(这应该返回与“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 的名称参数。然后我将这两个传递给 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"))

Symbol/intern 也可以:

(clojure.lang.Var/intern
(clojure.lang.Namespace/findOrCreate
(clojure.lang.Symbol/intern nil "clojure.core"))
(clojure.lang.Symbol/intern nil "require"))

关于java - Clojure 与 Var.intern 和 RT.var 的怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2060025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com