由 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和读取器规范则不允许。