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 (file:/home/chas/dev/clojure/cljs/.repl/cljs/reader.js#451)

关键字开头数字的问题独立出现,因为它们已经在一段时间内被Clojure支持,但现在可以被视为规范的一部分。参见CLJ-1286。

BTW,这是另一个(链接: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//}},这些在规范中没有明确说明。这两个都在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报告)
...