2024 年 Clojure 问卷调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解更多关于如何使用本站的信息。

0
ClojureScript

ClojureScript:foo> (r/read-string ":0") "Error evaluating:" (r/read-string ":0") :as "cljs.reader.read_string.call(null,\":0\")" org.mozilla.javascript.EcmaError: TypeError: Cannot read property "0.0" from null (文件:/home/chas/dev/clojure/cljs/.repl/cljs/reader.js#451)

关于关键字开头的数字,这个问题被单独提出,因为Clojure已经支持了一段时间,但现在可以被认为是规范的一部分。参见 CLJ-1286。

顺便说一句,这又是一个(链接:https://github.com/reiddraper/simple-check/ 文本:simple-check)的胜利... :-)

11 个答案

0
由 cemerick 发表的评论:

这不是一个简单的正则表达式更改,就像我希望在最近的Clojureesinde所做的那样。{{cljs.reader}} 的符号模式忠实于Clojure HEAD,但匹配处理并不是。我认为修复现有的东西与移植{{clojure.tools.reader.impl.commons/parse-symbol}}(它顺便说一下不使用正则表达式)相比是如此,不管怎样,留到以后吧(或者如果有人有兴趣)。
0

由 favila 发表的评论:

我想我已经修复了你提到的问题(CLJS-775 CLJS-776),但我仍然对CLJ-1286感到困惑。clojure读取器文档和edn规范仍然说应该拒绝 :0,但1.6.0却没有。预期的行为是什么?规范会被修复,还是clojure阅读器被修复并于下游包修复11 个答案

0

评论者:wagjo

据我所知,EDN规范并不拒绝:0(没有规则说明第二个字符不能是数字)。请参见https://github.com/wagjo/serialization-formats,了解我对现有规范的解读。

0

由 favila 发表的评论:

啊,我想我明白了混淆的来源。EDN和clojure读取规范都说了类似的话:“关键词类似于符号,只是以冒号开头。”混淆在于我们是否将其理解为以下意思

  1. 第一个字符是冒号,然后第二个字符及其后的字符与符号定义匹配。
  2. 第一个字符是冒号,整个表达式与符号定义匹配。

CLJ-1003、CLJ-1252和CLJ-1286以及我个人都似乎理解第一种含义。这可能是当我们说“关键词的第一个字符”时,我们通常是指在冒号之后的第一个字符,好像冒号是一个“特殊”的字符,而不是关键词的一部分(例如,像读取宏字符)。

然而clojure 1.6似乎遵循第二种含义(并解释了为什么:0/a是可以的,但是:0/0是不可以的),我不确定从引用的标签和谷歌集团讨论中,这是否因为下游的破坏,还是这是预期的解释,CLJ-1252的补丁被Alex Miller错误地接受了。

注意,如果我们接受第二种解释,那么clojure读取器文档中的限制“一个符号可以包含一个或多个非重复的‘:’”对于关键词是不正确的。(由于EDN不允许命名空间展开的关键词,所以这似乎不是问题。)

此外,EDN允许在符号中连续使用冒号,而clojure 1.6和读取器规范则不允许。

0

由 favila 发表的评论:

此外,clojure 1.6允许{{a/:a}}和{{:a/:a}}(其中名称部分违反了符号的第一字符规则),尽管规范没有提到这一点。(这恐怕是您表格中没有提到的事情。不过,工作非常细致!我希望读取器规范更加形式化、明确……)

0

由 favila 发表的评论:

我认为这个模式遵循规范

`

"(?x)

(?!///) # 特例:只能在名称部分使用/。

符号或关键词的名称部分或名称空间部分

(?:
# 除法符号
(/
# 正常符号

存在命名空间时的名称部分

|[a-zA-Z*!_?$%&=<>][0-9a-zA-Z*!_?$%&=<>\#:+.-]*
|[-+.](?:[a-zA-Z*!_?$%&=<>\#:+.-][0-9a-zA-Z*!_?$%&=<>\#:+.-]*)?))?

1: 符号名称或命名空间 2: 关键词冒号(s) 3: 关键词名称或命名空间

4: 关键词或符号名称(以及组 1 和 3 是命名空间)"

`

问题

  1. 不强制执行非重复冒号规则(但匹配后容易验证)。
  2. 拒绝符合 clojure 接受的符号的第一个字符规则的违规。
  3. 接受命名空间后面的冒号(与 clojure 不同)。
  4. 接受 {{foo//}} 或 {{:foo//}},这在规范中并没有明确说明。(Jozef 的表有更多背景信息)。这两种在 Clojure 1.6 中都是允许的,但在 1.5 或(有争议)edn 中则不是。
0

由 favila 发表的评论:

另一个问题:接受 {{:::a/b}},我认为根据规范它是可以的,但在 1.6 中不能读取。疯狂示例

`
user=> (require ['clojure.core :as (symbol ":a")])
nil
user=> :::a/map

RuntimeException Invalid token: :::a/map clojure.lang.Util.runtimeException (Util.java:221)
user=> (resolve (symbol ":a" "map"))

'clojure.core/map

`

理论上我可能期望 {{:::a/map}} 被读取为 {{:clojure.core/map}}?

0

由 alex+import 发布的评论

提升这个,因为我刚刚一个小时的头痛,终于找到这是罪魁祸首

0
评论由:dnolen_ 发布

Nicolás,工单的前提是这应该被支持,但 Clojure 文档中关于有效关键词的表述明确表示这是不可行的。Clojure 实现只是恰巧允许它。无论如何,这需要在 Clojure 中首先解决。
0

由 favila 发表的评论:

我认为 CLJ-1527 是目前追踪此问题的工单。

0
引用: https://clojure.atlassian.net/browse/CLJS-677(由cemerick报告)
...