请分享您的想法,参与 2024 年 Clojure 状态调查!

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

0
ClojureScript

ClojureScript:foo>(r/read-string ":0") "错误评估:" (r/read-string ":0") :as "cljs.reader.read_string.call(null,\":0\")" org.mozilla.javascript.EcmaError: TypeError: 无法从 null 读取属性 "0.0" (文件:/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*!?$%&=<>#:+.-])?)
# 关键字
|(::?)([0-9a-zA-Z
!_?$%&=<>#:+.-]+))

具有命名空间时的名称部分

(?:/(/ # 除号符号

|[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 无效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
by
参考资料: https://clojure.atlassian.net/browse/CLJS-677 (由 cemerick 汇报)
...