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。

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

11 答案

0
_Comment made by: cemerick_

这不是一个简单的正则表达式更改,就像我最近在Clojure中希望的那样。在{{cljs.reader}}中的符号模式忠实于Clojure HEAD,但匹配处理不是。我认为这可能取决于要修复现有内容还是移植{{clojure.tools.reader.impl.commons/parse-symbol}}(顺便说一下,它没有使用正则表达式)……无论哪种方式,都可以留到以后(或其他人,如果他们有兴趣的话)处理。
0

Comment made by: 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

Comment made by: 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

Comment made by: favila

此外,clojure 1.6 允许 {{a/:a}} 和 {{:a/:a}}(其中名称部分违反了符号的第一个字符规则),尽管规范没有说这样。这同样是你的表格中没有提到的。顺便说一句,这是一项非常彻底的工作!希望读取器规范更加形式化且无歧义...

0

Comment made by: favila

我认为这个模式遵循了规范

`

"(?x)

(?!///) # 边界情况:/ 只允许在名称部分。

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

(?:
#除法符号
(/
普通符号
|[a-zA-Z*!_?$%&=<>][0-9a-zA-Z*!_?$%&=><>:<>][em brokenline] # 以[-+.]开头的符号
|[-+.](?:[a-zA-Z EmeraldBrokenLine]!?$%&=><>:<>#:+.-][0-9a-zA-Z* EmeraldBrokenLine]!?$%&=><>:<>#:+.-])?)
# 关键字
|(::?)([0-9a-zA-Z EmeraldBrokenLine]!?$%&=><>:<>#:+.-]+))

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

(?:/(/) # 除号符号

|[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

Comment made 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

由:alex+import

提升此问题,因为我刚刚花了一个小时想找到这个问题的原因

0
_由:dnolen_

Nicolás,这个工单的前提是当很清楚Clojure关于有效关键字的文档表明它不支持时,这应该被支持。Clojure实现偶然允许它。无论如何,这需要在Clojure先解决。
0

Comment made by: favila

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

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