Clojure:字符字面量相等

3

我有些天真地认为,在Clojure中,无论如何生成单个字符字符串,它们都是相等的。

(= "G" "G")
=>
true

(= "G" \G)
=>
false

(= \G \G)
=>
true

原来并不是这样。有人能解释一下吗?
2个回答

5

一个字符并不等同于一个单字符字符串。相反,单字符字符串可以被视为一个序列,其第一个且唯一的项是一个字符。

(type "G")
;=> java.lang.String
(type \G)
;=> java.lang.Character

(count "G")
;=> 1
(count \G)
;=> UnsupportedOperationException count not supported on this type: Character

(seq "G")
;=> (\G)
(seq \G)
;=> IllegalArgumentException Don't know how to create ISeq from: java.lang.Character

(first "G")
;=> \G
(first \G)
;=> IllegalArgumentException Don't know how to create ISeq from: java.lang.Character

作为 Clojure Koans 的一部分,还提供了额外的解释和练习。 - imranolas

5

为了完整起见……ClojureScript与Clojure不同,其行为与OP所推测的完全相同。由于Javascript没有字符类型,只有字符串,因此ClojureScript字符被实现为单个字符字符串。

在ClojureScript REPL中:

(= "G" "G")
;=> true

(= "G" \G)
;=> true

(= \G \G)
;=> true

(type "G")
;=> #object[String "function String() {
;=>    [native code]
;=> }"]

(type \G)
;=> #object[String "function String() {
;=>    [native code]
;=> }"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接