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