欢迎!有关如何使用本站的信息,请参阅关于页面。
Clojure 1.10.1中,使用限定关键词中的数字会导致语法错误
user> :ns/1 Syntax error reading source at (REPL:136:1). Invalid token: :ns/1
然而,我可以使用 keyword 来构建它
keyword
users> (keyword "ns" "1") :ns/1
我的问题是第二个形式不是一个合法的测试表达式,不能用于case语句中。
case
注意:我不是一个有权决定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读取器修改为不允许读取以数字开头的一些关键字,但由于一些现成的库已经依赖这种行为,他们不想为此问题破坏向下兼容性,因此回滚了这项更改。