Clojurescript如何用数字关键字读取字符串映射?

slh*_*sen 2 clojure clojurescript

试图从字符串中读取哈希映射,但如果键是"关键字"类型值,我从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"}
Run Code Online (Sandbox Code Playgroud)

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

(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
Run Code Online (Sandbox Code Playgroud)

相同的代码适用于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"}
Run Code Online (Sandbox Code Playgroud)

Joo*_*aat 5

cljs.reader不支持以数字字符开头的关键字,可能是因为符号和扩展名关键字必须以非数字字符开头,尽管官方文档中的表述可以进行多种解释.见http://clojure.org/reference/reader#_symbolshttp://clojure.org/reference/reader#_literals

clojure阅读器(jvm实现)总是支持类似的关键字:1234,现在可能不会改变.

较短的失败示例:

(require 'cljs.reader)
(cljs.reader/read-string ":1")
Run Code Online (Sandbox Code Playgroud)

附录:总是可以使用keyword函数在clojure中构造其他类型的不可读关键字,并且使用这些关键字产生的问题属于"未定义的行为" - 换句话说:如果你做了类似的事情,你就可以自己做(keyword " ")

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