types - 为什么 Clojure 中的 `type` 函数返回与 Java、Clojure 本身相关的结果,而不是与任何语言相关的结果?

我正在使用 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.Booleanclojure.lang.PersistentList 都是 Clojure 符号,它们是 Java 类的完全限定名称。

Boolean 是包 java.lang 中的 Java 原生类。

PersistentListclojure.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 中的内容 - 例如StringBoolean 在这里。 Java 没有持久性集合,因此 Hickey 必须实现这些。

Rich Hickey 对 Clojure 进行了一些很好的讨论,例如 https://www.youtube.com/watch?v=2V1FtfBDsLU。他详细阐述了按照他的方式设计 Clojure 的理由。

回答4

我认为理解这一点也很重要,不仅仅是“Clojure 和 Java 之间的集成”。 Clojure 是用 Java 实现的。 Clojure 在 JVM 上运行。 Clojure 在底层使用 Java 的类型系统。 Clojure 中的每个“类型”都是一个 Java 类。

原来问题的措辞让我觉得这种深层关系不清楚。当然,我可能是错的,字里行间。在这种情况下,请原谅噪音。 :-)

相似文章

随机推荐

最新文章