我正在使用 Clojure、Emacs 和 Cider。
在 Cider REPL 中,type
函数返回以下内容:
user> (type true)
java.lang.Boolean
user> (type '(1 2))
clojure.lang.PersistentList
user> (type nil)
nil
从更高层次的理解,我知道 Clojure 和 Java 之间存在集成。我认为这是 Clojure 导入 Java 库的一种方式。但是,这种联系似乎不止于此。
但是,为什么 type
有时会引用 Java 语言?为什么它引用 Clojure 语言?为什么有时它根本不提及任何语言(nil
)?
回答1
准确地说,java.lang.Boolean
和 clojure.lang.PersistentList
都是 Clojure 符号,它们是 Java 类的完全限定名称。
Boolean
是包 java.lang
中的 Java 原生类。
PersistentList
是 clojure.lang
包中的 Clojure 定义的类。这是https://github.com/clojure/clojure/blob/b1b88dd25373a86e41310a525a21b497799dbbf2/src/jvm/clojure/lang/PersistentList.java#L11。
Clojure 编译器是用 Java 语言编写的,因此所有 Clojure types 最终都实现为 Java types(即 Java 类)。
回答2
输出中对 Java 和 Clojure 的引用是命名空间;实际上,完全限定的类型名称包含定义它们的命名空间,可以是 java.lang
代表 Java 固有的 types(并被 Clojure 重用),或 clojure.lang
代表 types 在 Clojure 运行时。
nil
是 Clojure 的等价于 Java 的 null
,并且没有类型。有关 nil
的更多信息,请参阅 https://clojure.org/reference/data_structures。
回答3
好吧,在某些情况下,没有理由重新实现 Clojure 中的内容 - 例如String
或 Boolean
在这里。 Java 没有持久性集合,因此 Hickey 必须实现这些。
Rich Hickey 对 Clojure 进行了一些很好的讨论,例如 https://www.youtube.com/watch?v=2V1FtfBDsLU。他详细阐述了按照他的方式设计 Clojure 的理由。
回答4
我认为理解这一点也很重要,不仅仅是“Clojure 和 Java 之间的集成”。 Clojure 是用 Java 实现的。 Clojure 在 JVM 上运行。 Clojure 在底层使用 Java 的类型系统。 Clojure 中的每个“类型”都是一个 Java 类。
原来问题的措辞让我觉得这种深层关系不清楚。当然,我可能是错的,字里行间。在这种情况下,请原谅噪音。 :-)