2024 Clojure状态调查!中分享你的想法。

欢迎!请参阅关于页面以获取更多关于这是如何运作的信息。

+1
语法和读取器
重新标签

我的一个朋友正在编写一个 DSL,并想在符号中使用字符 ૪。如果你尝试将这个字符作为 Clojure 中符号的一部分使用,你会得到一个类似的错误。

user=> (read-string "૪")
Execution error (NumberFormatException) at user/eval5 (REPL:1).
Invalid number: ૪
user=>

这个问题的原因似乎是这样的

user=> (Character/isDigit \૪)
true
user=>

该字符是古吉拉特语中的数字,因此 java 的 Character/isDigit 返回 true,因此 Clojure 读取器尝试将其解析为数字,但它只能处理阿拉伯数字(也许还有十六进制)。

如果读取器将要依赖于 Character/isDigit,那么它应该能够将任何这些字符转换为数字,或者读取器应该允许“它不知道如何处理的数字”成为符号。

2 条回答

0

总的来说,Clojure的意图主要是类似于Java,因此值得看看Java如何处理 \૪。

我认为Java解析不会将其视为数字,因此Clojure可能也不应该。
对此有点惊讶,但

dev=> (Long/parseLong "૪")

4

dev=> (Long/parseLong "૪૪૪")

444
我在谈论Java代码中的数值字面量,它将不会解析(JLS要求ASCII数字0-9)。
0
...