为什么 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 中重新实现一些东西——例如String
或 Boolean
如此处。 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.Boolean
和
clojure.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.
顺便说一下,原问题的措辞让我觉得这个深层关系不清楚。当然,从字里行间看,我可能是错的。在那种情况下,请原谅噪音。 :-)
我正在使用 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 中重新实现一些东西——例如String
或 Boolean
如此处。 Java 没有永久集合,因此 Hickey 必须实现这些集合。
Rich Hickey 就 Clojure 发表了一些精彩的演讲,例如 this one。他以自己的方式设计 Clojure 的很多理由。
输出中对 Java 和 Clojure 的引用是命名空间;实际上,完全限定的类型名称包含定义它们的命名空间,对于 Java 固有的类型(并被 Clojure 重用)可以是 java.lang
,或者对于定义在中的类型可以是 clojure.lang
Clojure 运行时。
nil
等同于 Java 的 null
,并且没有类型。有关 nil
.
准确地说,java.lang.Boolean
和
clojure.lang.PersistentList
每个 Clojure 符号 都是 Javaclass.[=17= 的 fully-qualified 名称 ]
Boolean
是包 java.lang
.
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.
顺便说一下,原问题的措辞让我觉得这个深层关系不清楚。当然,从字里行间看,我可能是错的。在那种情况下,请原谅噪音。 :-)