Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types 在Clojure中,为什么有字符串、关键字和符号?_Types_Clojure_Symbols - Fatal编程技术网

Types 在Clojure中,为什么有字符串、关键字和符号?

Types 在Clojure中,为什么有字符串、关键字和符号?,types,clojure,symbols,Types,Clojure,Symbols,我正在学习Clojure,我无法理解一些语言设计决策:为什么像Clojure这样具有不可变字符串的语言也需要关键字和符号数据类型?字符串不能只有可选的名称空间和元数据以及所有这些东西吗?对于不可变字符串,比较也可以是标识基,不是吗 或者,因为与Java的互操作是Clojure必须具备的,所以至少要具备Java字符串类型和关键字符号数据类型 我觉得这个字符串/关键字/符号“三分法”特别奇怪,因为Clojure似乎非常注重“纯洁”,并在其他方面保持简单。它们在语言中扮演着非常不同的角色: 变量用于

我正在学习Clojure,我无法理解一些语言设计决策:为什么像Clojure这样具有不可变字符串的语言也需要关键字和符号数据类型?字符串不能只有可选的名称空间和元数据以及所有这些东西吗?对于不可变字符串,比较也可以是标识基,不是吗

或者,因为与Java的互操作是Clojure必须具备的,所以至少要具备Java字符串类型和关键字符号数据类型


我觉得这个字符串/关键字/符号“三分法”特别奇怪,因为Clojure似乎非常注重“纯洁”,并在其他方面保持简单。

它们在语言中扮演着非常不同的角色:

  • 变量用于给事物命名。它们实现
    runnable
    ,可以直接用于调用函数。不能运行字符串
  • 关键字本身就是名称,可以在地图中查找。它们确实有助于Clojure保持其“数据驱动”的风格。字符串不实现在映射中查找自己所需的接口
  • 字符串就是字符串。他们做他们需要做的事,而不是更多
Clojure设计中的一个核心原则是拥抱您的主机平台,因此在Clojure中,字符串是Java字符串,您永远不需要将Java字符串包装在一些
转换为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的更好的“直觉”…另请参见:不,不变性并不意味着身份比较就足够了,您仍然可以有多个具有相同内容的不可变实例。这一假设只适用于内部字符串。