我正在学习Clojure,并且无法理解某些语言设计决策:为什么像Clojure这样具有不可变字符串的语言也需要关键字和符号数据类型?字符串不能仅具有可选的 namespace 和元数据以及所有这些东西吗?对于不可变的字符串比较,同样可以基于身份,不是吗?

或者,由于Clojure必须具有与Java的互操作,因此至少具有Java String类型和KeywordSymbol数据类型。

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

最佳答案

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

  • Vars用于给事物命名。它们实现了runnable,可以直接用于调用函数。您不能运行字符串。
  • 关键字本身就是名称,可以在 map 中查找。它们确实有助于Clojure保持其“数据驱动”风格。字符串未实现在 map 中查找自身所需的接口(interface)。
  • 字符串只是字符串。他们做了他们需要做的事情,而没有做更多的事情。

  • Clojure设计的核心原则之一就是拥抱您的主机平台,因此Clojure字符串是Java字符串,您无需将Java字符串包装在某些convert-to-clojure-string函数中就可以将其带入Clojure生态系统。必须使用未修改的Java字符串以及数字类型。关键字和符号是Clojure所添加的新结构,因此仅需要使它们能够以有用的方式从Java生态系统的其余部分进行访问。符号和关键字仅是实现接口(interface)的类,从而使自己可以访问。最初,人们认为,要使一种新语言在JVM生态系统中获得成功,就必须充分采用Java并最大程度地减少“阻抗不匹配”(对流行语的歉意),即使这需要向语言中添加更多内容。没有这个目标是必需的。

    编辑:

    您可以通过def将符号自身转换为关键字来将其转换为关键字
    user> a
    ; Evaluation aborted.
    user> :a
    :a
    user> (def a 'a)
    #'user/a
    user> a
    a
    user>
    

    关键字对自己进行评估

    10-02 05:21