Clojurescript 如何读取带有数字关键字的字符串映射?

Clojurescript how to read-string map with numeric keywords?

尝试从字符串读取散列映射,但如果键是 "keyword" 类型值,我从 cljs.reader/read-string 收到错误。从字符串中读取散列映射的正确方法是什么?

这个没有关键字的版本有效:

(cljs.reader/read-string (pr-str {1 "a", 1481876814936 "sdafa", 1481876816039 "afdas", 1481876817344 "asdfa", 2 "b"}))
=> {1 "a", 1481876814936 "sdafa", 1481876816039 "afdas", 1481876817344 "asdfa", 2 "b"}

但是这个带有关键字的版本会抛出一个错误:

(cljs.reader/read-string (pr-str {:1 "a", :1481876814936 "sdafa", :1481876816039 "afdas", :1481876817344 "asdfa", :2 "b"}))
 cljs.user=> #object[TypeError TypeError: Cannot read property '0' of null]
TypeError: Cannot read property '0' of null
    at cljs$reader$read_keyword (file:///test/resources/public/js/ui-out/cljs/reader.js:681:19)
    at cljs$reader$read_delimited_list (file:///test/resources/public/js/ui-out/cljs/reader.js:397:20)
    at cljs$reader$read_map (file:///test/resources/public/js/ui-out/cljs/reader.js:466:41)
    at cljs$reader$read (file:///test/resources/public/js/ui-out/cljs/reader.js:879:34)
    at cljs$reader$read_string (file:///test/resources/public/js/ui-out/cljs/reader.js:911:25)
    at eval (eval at figwheel$client$utils$eval_helper (file:///test/resources/public/js/ui-out/figwheel/client/utils.js:143:8), <anonymous>:1:114)
    at eval (eval at figwheel$client$utils$eval_helper (file:///test/resources/public/js/ui-out/figwheel/client/utils.js:143:8), <anonymous>:9:3)
    at eval (eval at figwheel$client$utils$eval_helper (file:///test/resources/public/js/ui-out/figwheel/client/utils.js:143:8), <anonymous>:14:4)
    at figwheel$client$utils$eval_helper (file:///test/resources/public/js/ui-out/figwheel/client/utils.js:143:8)
nil

相同的代码适用于 clojure:

user=> (read-string (pr-str {:1 "a", :1481876814936 "sdafa", :1481876816039 "afdas", :1481876817344 "asdfa", :2 "b"}))
{:1 "a", :1481876814936 "sdafa", :1481876816039 "afdas", :1481876817344 "asdfa", :2 "b"}

cljs.reader 不支持以数字字符开头的关键字,可能是因为符号以及扩展的关键字必须以非数字字符开头,尽管官方文档中的公式是开放的多种解释。参见 http://clojure.org/reference/reader#_symbols and http://clojure.org/reference/reader#_literals

clojure reader(jvm 实现)始终支持 :1234 等关键字,现在可能不会改变。

较短的失败示例:

(require 'cljs.reader)
(cljs.reader/read-string ":1")

附录:总是可以使用 keyword 函数在 clojure 中构造其他类型的不可读关键字,使用这些关键字导致的问题属于 "undefined behaviour" - 换句话说:你是靠自己,如果你做 (keyword " ")

附录 1:关于 cljs.reader 中问题的 JIRA 票证位于 http://dev.clojure.org/jira/browse/CLJS-677

在 Clojure 方面,最初的意图是关键字标识符遵循与符号标识符基本相同的规则(不允许前导数字)。

但是,用于接受这些的正则表达式存在错误(由于它与符号、关键字和前导数字的差异一起使用的方式)。特别是,领先的 : 搞砸了。该修复已在 CLJ-1252 中实施,并在 Clojure 1.6 的工作期间提交。

我们在发布 1.6 的早期版本后立即了解到,许多人实际上在使用带前导数字的关键字。特别是,我记得 java.jdbc 就是这样命名列的。

由于在一切正常的情况下似乎没有任何充分的理由来破坏这些程序,因此我们恢复了更改并基本上保留了关键字接受数字的能力。我认为这在 Clojure 中不太可能改变。在这一点上,我觉得ClojureScript大概应该效仿一下,匹配Clojure。

edn 有点不同——它在很多方面有意比 Clojure/ClojureScript 更严格。在这一点上,待定将在那里做什么。