在Clojure中,为什么要使用字符串,关键字和符号?

时间:2012-07-25 17:13:57

标签: types clojure symbols

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

或者,因为与Java的互操作是Clojure的必备条件,至少具有Java String类型和KeywordSymbol数据类型。

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

2 个答案:

答案 0 :(得分:14)

他们在语言中填补了非常不同的角色:

  • Vars用于为事物命名。它们实现runnable,可以直接用于调用函数。你不能运行一个字符串。
  • 关键字本身就是名称,并在地图中查找自己。他们真的帮助Clojure保持其“数据驱动”的味道。字符串不实现所需的接口以在地图中查找自己。
  • 字符串只是字符串。他们做了他们需要做的事情而不是更多。

Clojure设计的核心原则之一是拥抱您的主机平台,因此在Clojure字符串中是Java字符串,您永远不需要在某些convert-to-clojure-string中包装Java字符串功能是为了让它进入Clojure生态系统。这需要使用未修改的Java字符串以及数字类型。关键字和符号是由Clojure添加的新构造,因此只需要从Java生态系统的其余部分以有用的方式访问它们。符号和关键字只需要实现接口的类就可以访问它们。一开始认为,为了使新语言在JVM生态系统中取得成功,它需要完全接受Java并最大限度地减少“阻抗不匹配”(对于流行语来说很抱歉),即使这需要在语言中添加更多语言。没有这个目标就被要求了。

编辑:


您可以通过def将符号转换为自己的关键字

user> a
; Evaluation aborted.
user> :a
:a
user> (def a 'a)
#'user/a
user> a
a
user> 

关键字评估自己

答案 1 :(得分:4)

我认为Clojure重视“实用性”(如果这是正确的话),而不是“纯度”。这可以从事实中看出,Clojure除了列表之外还具有地图,向量和集合的语法,并且正在使用它来定义语言。在Scheme中,它更关注纯度(IMO),你只有列表的语法。

正如Arthur Ulfeldt指出字符串,关键字和符号有其预期的用例。按预期使用它们可以更容易地阅读Clojure代码。它类似于HTML 5所发生的事情,它增加了语义标记。 <article><section>之类的内容,您可以在HTML 4中使用<div class="article"><div class="section">来表示。

OH,你只是通过身份来比较字符串是错误的。这保证仅适用于实习字符串。并且你不想实习太多的字符串,因为它们被存储在所谓的permgen中,这个permgen的大小非常有限而且从不垃圾收集。