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 就不行),我不确定从引用的票据和谷歌组讨论中能否确认这是由于下游损坏,还是这是预期的解释,Alex Miller 不正确地接受了 CLJ-1252 的补丁。

注意,如果我们接受第二种解释,那么从 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
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
by
...