评论来自: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 和读取器规范不允许。