由 favila 发表的评论
啊,我想我现在明白了困惑的来源。EDN 和 clojure 读取器规范都说了类似“关键字像符号一样,只不过以冒号开头。”的语句。困惑在于我们是否将其解读为以下含义
- 第一个字符是冒号,然后匹配符号定义的第二个字符和之后的字符。
- 第一个字符是冒号,整个表达式都与符号定义匹配。
CLJ-1003、CLJ-1252 和 CLJ-1286 以及我自己都似乎理解第一种含义。这也许是因为当我们说“关键字的第一个字符”时,我们通常指的是冒号之后的第一个字符,就像冒号是“特殊”的,并不是关键字的一部分(例如,像读取器宏字符)。
然而,clojure 1.6 似乎遵循第二种含义(并解释了为什么 :0/a
是可接受的,但 :0/0
则不行),而且我不确定从引用的工单和谷歌群组讨论中,这是否是因为下游的破坏,或者这是预期的解释,并且 CLJ-1252 的补丁被 Alex Miller 错误地接受了。
注意,如果我们接受第二种解释,那么读取器文档中“一个符号可以包含一个或多个非重复的 ':'”的限制对关键字是不正确的。(似乎 EDN 不允许命名空间展开的关键字,因此那里不是问题。)
此外,EDN 允许在符号中使用连续的冒号,而 clojure 1.6 和读取器规范则不允许。