Types 在Clojure中,为什么有字符串、关键字和符号?
我正在学习Clojure,我无法理解一些语言设计决策:为什么像Clojure这样具有不可变字符串的语言也需要关键字和符号数据类型?字符串不能只有可选的名称空间和元数据以及所有这些东西吗?对于不可变字符串,比较也可以是标识基,不是吗 或者,因为与Java的互操作是Clojure必须具备的,所以至少要具备Java字符串类型和关键字符号数据类型Types 在Clojure中,为什么有字符串、关键字和符号?,types,clojure,symbols,Types,Clojure,Symbols,我正在学习Clojure,我无法理解一些语言设计决策:为什么像Clojure这样具有不可变字符串的语言也需要关键字和符号数据类型?字符串不能只有可选的名称空间和元数据以及所有这些东西吗?对于不可变字符串,比较也可以是标识基,不是吗 或者,因为与Java的互操作是Clojure必须具备的,所以至少要具备Java字符串类型和关键字符号数据类型 我觉得这个字符串/关键字/符号“三分法”特别奇怪,因为Clojure似乎非常注重“纯洁”,并在其他方面保持简单。它们在语言中扮演着非常不同的角色: 变量用于
我觉得这个字符串/关键字/符号“三分法”特别奇怪,因为Clojure似乎非常注重“纯洁”,并在其他方面保持简单。它们在语言中扮演着非常不同的角色:
- 变量用于给事物命名。它们实现
,可以直接用于调用函数。不能运行字符串runnable
- 关键字本身就是名称,可以在地图中查找。它们确实有助于Clojure保持其“数据驱动”的风格。字符串不实现在映射中查找自己所需的接口
- 字符串就是字符串。他们做他们需要做的事,而不是更多
转换为Clojure字符串函数中,以便将其放入Clojure生态系统。这就需要使用未修改的Java字符串以及数字类型。关键字和符号是Clojure添加的新构造,因此只需要以一种有用的方式从Java生态系统的其余部分访问它们。符号和关键字只需作为实现接口的类就可以访问。一开始,人们认为,为了让一种新语言在JVM生态系统中获得成功,它需要完全融入Java,并将“阻抗不匹配”(对流行语感到抱歉)降至最低,即使这需要向语言添加比没有这个目标所需更多的内容
编辑:
你可以通过def
将一个符号转换成一个关键字
user> a
; Evaluation aborted.
user> :a
:a
user> (def a 'a)
#'user/a
user> a
a
user>
关键词自我评价我认为Clojure更看重“实用性”(如果这是正确的话)而不是“纯度”。这可以从以下事实中看出:Clojure除了列表之外,还具有映射、向量和集合的语法,并且正在使用它来定义语言。在Scheme中,更关心纯度(IMO),您只有列表的语法
正如Arthur Ulfeldt指出的,字符串、关键字和符号都有其预期的用例。按预期使用它们可以更容易地阅读Clojure代码。这类似于HTML5,它增加了语义标记。类似于
和
的内容,可以用HTML4中的
和
来表示
哦,你错了,仅仅通过身份来比较字符串。这保证只对插入的字符串有效。你也不想在所谓的permgen中插入太多字符串,因为它们存储在所谓的permgen中,permgen的大小非常有限,而且从不进行垃圾收集。这无助于解释为什么关键字和字符串必须分开。例如,在Ruby中,字符串和符号都是必需的,因为一个是可变的,而另一个是不可变的。为什么你不能只使用关键字或字符串,而其中一个有自己查找的界面?我真的很喜欢关键字在地图和这些类型的行为中查找自己,但你也可以使用具有相同功能的字符串。关于实现runnable,也许我对同音象似性和“编写代码的代码”之类的东西没有足够深入的理解,因为我只看到这样的事情:(1)(def x+)(x23)
和(2)(def x'+)(x23)
做同样的事情(其中“+”代表任何函数名)我将补充更多关于这背后的设计决策,也许我遗漏了一些东西,但我不明白将关键字与引用符号区分开来的理由是什么。你不能用“
替换:
并去掉关键字吗?我是不是误解了引用?我认为这是为了明确目的。关键字设计用于数据查找,符号设计用于编译时查找。您可以保证只有一个具有给定名称的关键字,但该保证不适用于地图。我认为字符串没有被扩展的其他原因是由于关键字能够被命名,以及关键字使用的自定义实习行为。我认为在一些较新版本的JVM中,如果对实习字符串的所有引用都丢失了,实习字符串有资格被垃圾回收。我现在找不到可靠的消息来源,所以我可能错了。无论哪种方式,您都不应该经常将字符串与=
进行比较。有趣的是,我不知道JVM的内部字符串(您可能发现我不是Java爱好者,我是从完全不同的背景来到Clojure的,也许这是我发现一些受Java/JVM影响的语言设计决策很奇怪的方式:))…也许我应该在Clojure之前开始使用Scheme,以获得关于Lisp的更好的“直觉”…另请参见:不,不变性并不意味着身份比较就足够了,您仍然可以有多个具有相同内容的不可变实例。这一假设只适用于内部字符串。