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 发表的评论_

这并非简单的正则表达式更改,正如我之前所希望的,因为 Clojure 最近有所活跃。{{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 读取器一旦下游包得到修复就修复?()

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是命名空间)"《em>

`

问题

  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 无效标记::::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 报告)
...