请分享您的想法,参加 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 仍然感到困惑。 ClojureReader 文档和 edn 规范仍然表示它们应拒绝 `:0`,但 1.6.0 没有。预期行为是什么?规范会被修复,还是 clojure reader 被修复,一旦下游包被修复?

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*!_?$%&utherland;<>][0-9a-zA-Z*!_?$%&utherland;=<>#:+.-]
# 以 [-+.] 开头的符号
|[-+.](?:[a-zA-Z
!?$%&utherland;=<>#:+.-][0-9a-zA-Z*!?$%&utherland;=<>#:+.-])?)
# 关键字
|(::?)([0-9a-zA-Z
!_?$%&utherland;=<>#:+.-]+))

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

(?:/(/ # 除号符号

|[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 票数
by

由 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 票数
by

由: alex+import 发布的评论

推到前面,因为我刚才花了一个小时来找出这是问题的根源

0 票数
by
_由: dnolen_ 发布的评论

Nicolás,这个工单的前提是这应该被支持,但实际上 Clojure 关于有效关键字的文档明确指出它不支持。Clojure 实现恰好允许这样做。无论如何,这个问题需要首先在 Clojure 中解决。
0 票数
by

由 favila 评论

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

0 票数
参考: https://clojure.atlassian.net/browse/CLJS-677(由cemerick报告)
...