为什么 Clojure return 中的 `type` 函数结果关联到 Java、Clojure 本身,而不关联任何语言?

Why does the `type` function in Clojure return results associated to Java, to Clojure itself, and to no language?

我正在使用 Clojure、Emacs 和 Cider。

在 Cider REPL 中,type 函数 returns 如下:

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)?

嗯,在某些情况下,没有理由在 Clojure 中重新实现一些东西——例如StringBoolean 如此处。 Java 没有永久集合,因此 Hickey 必须实现这些集合。

Rich Hickey 就 Clojure 发表了一些精彩的演讲,例如 this one。他以自己的方式设计 Clojure 的很多理由。

输出中对 Java 和 Clojure 的引用是命名空间;实际上,完全限定的类型名称包含定义它们的命名空间,对于 Java 固有的类型(并被 Clojure 重用)可以是 java.lang,或者对于定义在中的类型可以是 clojure.lang Clojure 运行时。

nil 等同于 Java 的 null,并且没有类型。有关 nil.

的更多信息,请参阅 https://clojure.org/reference/data_structures

准确地说,java.lang.Booleanclojure.lang.PersistentList 每个 Clojure 符号 都是 Javaclass.[=17= 的 fully-qualified 名称 ]

Boolean 是包 java.lang.

中的 Java-native class

PersistentList 是包 clojure.lang 中的一个 Clojure-defined class。这里是 the source code.

Clojure 编译器是用 Java 语言编写的,因此所有 Clojure 类型最终都实现为 Java 类型(即 Java class)。

我认为理解这一点也很重要,不仅仅是“Clojure 和 Java 之间的集成”。 Clojure 在 Java 中实现。 Clojure 在 JVM 上运行。 Clojure 在后台使用 Java 的 type-system。 Clojure 中的每个“类型”都是 Java class.

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