请在 2024 Clojure 状态调查!分享您的想法。

欢迎!有关如何使用本站的信息,请参阅关于页面。

0
语法和读取器

Clojure 1.10.1中,使用限定关键词中的数字会导致语法错误

user> :ns/1
Syntax error reading source at (REPL:136:1).
Invalid token: :ns/1

然而,我可以使用 keyword 来构建它

users> (keyword "ns" "1")
:ns/1

我的问题是第二个形式不是一个合法的测试表达式,不能用于case语句中。

1 个答案

+2

被选中
 
最佳答案

注意:我不是一个有权决定Clojure语言是什么或不是什么的人,而是多年来一直密切关注的人,希望提供一些背景信息。

这在Clojure中是一个历史性的前沿案例,经常被问起,但似乎在ask.clojure.org之前没有人提问过。

对于官方文档中关于此精确含义的解释有所不同https://clojure.org/reference/reader但它确实说明“标识符以非数字字符开头”和“关键词类似于标识符,但是……它们可以且必须以冒号开头”。

keyword函数允许创建Clojure读取器无法读取的关键字类型值。如果您想要一种限制您只能构建Clojure读取器可以读取的关键字值的keyword变体,可能最好的方式是编写一个函数,该函数(a)使用keyword构建关键字,(b)将其转换为字符串,然后(c)尝试使用Clojure读取器读取它,如果结果关键字不可读,则返回某种错误状态,抛出异常,或您想要的任何其他操作。

曾经有一个工单CLJ-1252 https://clojure.atlassian.net/browse/CLJ-1252,他们临时将Clojure读取器修改为不允许读取以数字开头的一些关键字,但由于一些现成的库已经依赖这种行为,他们不想为此问题破坏向下兼容性,因此回滚了这项更改。

关于此问题在 https://clojure.org/guides/faq#keyword_number 有一个FAQ条目。
...