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
_由 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 错误地接受了。

注意,如果我们接受第二种解释,那么读取器文档中“一个符号可以包含一个或多个非重复的 ':'”的限制对关键字是不正确的。(似乎 EDN 不允许命名空间展开的关键字,因此那里不是问题。)

此外,EDN 允许在符号中使用连续的冒号,而 clojure 1.6 和读取器规范则不允许。

0

由 favila 发表的评论

此外,clojure 1.6 允许 {{a/:a}} 和 {{:a/:a}}(其中名称部分违反了符号的第一个字符规则),尽管规范中没有提及。请注意,这是你表格中没有提到的。不过,你的工作非常详尽!希望读取器规范更加规范化、明确……)

0

由 favila 发表的评论

我认为这个模式遵循规范

`

"(?x)

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

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

(?:
#除法符号
(/
普通符号
|[a-zA-Z*!_?$%&=<>][0-9a-zA-Z*!_?$%&=<>#:+.- Filter by realm
|[-+.](?:[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 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报告)
...