他们在语言中扮演着非常不同的角色:
- Vars 用于给事物命名。它们实现
runnable
并且可以直接用于调用函数。您不能运行字符串。
- 关键字本身就是名称,并在地图中查找自己。它们确实帮助 Clojure 保持其“数据驱动”的风格。字符串没有实现在地图中查找自身所需的接口。
- 字符串只是字符串。他们只做他们需要做的,仅此而已。
Clojure 设计的核心原则之一是拥抱您的主机平台,因此在 Clojure 中字符串是 Java 字符串,您永远不需要将 Java 字符串包装在一些convert-to-clojure-string
功能以使其进入 Clojure 生态系统。这需要使用未修改的 Java 字符串以及数字类型。关键字和符号是 Clojure 添加的新结构,因此只需让它们以一种有用的方式从 Java 生态系统的其余部分访问即可。符号和关键字只需作为实现接口的类即可访问。一开始人们认为,为了让一种新语言在 JVM 生态系统中取得成功,它需要完全拥抱 Java 并最大限度地减少“阻抗不匹配”(对于流行语感到抱歉),即使这需要在语言中添加更多内容。没有这个目标就需要。
编辑:
您可以通过将符号转换为def
自身来将其转换为关键字
user> a
; Evaluation aborted.
user> :a
:a
user> (def a 'a)
#'user/a
user> a
a
user>
关键字评估自己