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