我正在学习Clojure,我无法理解一些语言设计决策:为什么像Clojure这样的不可变字符串的语言也需要关键字和符号数据类型?字符串是否只有可选的命名空间和元数据以及所有这些东西?对于不可变的字符串,比较也可以是身份基础,不是吗?
或者,因为与Java的互操作是Clojure的必备条件,至少具有Java String类型和KeywordSymbol数据类型。
我发现这个字符串/关键字/符号“三分法”特别奇怪,因为Clojure似乎非常关注“纯度”并且在其他方面保持简单。
答案 0 :(得分:14)
他们在语言中填补了非常不同的角色:
runnable
,可以直接用于调用函数。你不能运行一个字符串。 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的大小非常有限而且从不垃圾收集。