加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 01:11:38 所属栏目:Java 来源:网络整理
导读:所以我正在尝试探索Clojure的内部,我遇到了一些我不太确定的理解: 从REPL中,我可以正常访问RT.var(“clojure.core”,“require”)(这应该返回与“clojure.core”命名空间中的“require”符号相关联的var): user= (clojure.lang.RT/var "clojure.core" "req

所以我正在尝试探索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"))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读