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

Neu*_*onQ 18 types symbols clojure

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

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

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

Art*_*ldt 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> 
Run Code Online (Sandbox Code Playgroud)

关键词评估自己

  • 我认为它专注于目的明确.关键字设计为数据查找,符号设计用于编译时查找.您可以保证只有一个具有给定名称的关键字,但该地图不存在该保证.我认为为什么不仅仅扩展字符串的其他原因是由于关键字能够被命名空间并且由于关键字使用的自定义实习行为. (4认同)