由 favila 发布的评论
啊,我想我看到了混淆的原因。EDN和clojure读取器规范都说了类似于“关键字就像符号,只是以冒号开头”的话。混淆在于我们是否将这理解为以下意思
- 第一个字符是冒号,然后第二个字符及其后面的字符与符号定义匹配。
- 第一个字符是冒号,整个形式与符号定义匹配。
CLJ-1003、CLJ-1252、CLJ-1286以及我本人似乎都理解第一种意思。这可能是当我们说“关键字的第一个字符”时,我们通常是指冒号之后的第一个字符,就像冒号是“特殊”的,不是关键字的组成部分(例如,就像读取器宏字符)。
然而,clojure 1.6似乎遵循第二种意思(并解释了为什么:0 / a 是有效的,但:0 / 0 不是),我不确定从引用的票据和谷歌群组讨论中,这是否由于下游损坏,或者是这个意图的解释,以及CLJ-1252的补丁被Alex Miller错误地接受。
注意,如果我们接受第二种解释,那么clojure读取器文档中的限制“一个符号可以包含一个或多个非重复的冒号”对于关键字是不正确的。(EDN似乎不允许命名空间展开的关键字,所以那不是问题。)
此外,EDN允许在符号中使用连续的冒号,而clojure 1.6和读取器规范则不允许。