clojurescript如何使用数字关键字读取弦图



尝试从字符串中读取哈希映射,但是如果键是"关键字"类型值,我会从cljs.s.s.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和http://clojure.org/reference/reader/reader#_literals

Clojure读取器(JVM实现)始终支持:1234这样的关键字,现在可能不会更改。

较短的失败示例:

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

附录:始终可以使用keyword函数在Clojure中构造其他类型的不可读的关键字,并且使用这些关键字所带来的问题属于"未定义的行为" - 换句话说:如果您自己做事,那么您是一个单词像(keyword " ")

附录1:有关cljs.reader中问题的JIRA票,请访问http://dev.clojure.org/jira/jira/browse/cljs-677

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

然而,用来接受这些的正则是有障碍(由于它与符号的同时使用,然后是关键字和领先数字的差异)。特别是,领先的:将其弄乱了。该修复程序是在CLJ-1252中实施的,并在工作期间用于Clojure 1.6。

我们立即了解到发布了1.6的早期版本,许多人实际上使用了带有领先数字的关键字。特别是,我记得java.jdbc以这种方式命名列。

由于一切正常时似乎没有任何充分的理由破坏这些程序,因此我们恢复了变化,从本质上讲,祖父关键字接受数字的能力。我认为这可能不会改变Clojure。在这一点上,我认为Clojurescript可能应该效仿并匹配Clojure。

edn是一个不同的故事 - 在多种方式上,它故意比clojure/clojurescript更具限制性。此时是TBD。

最新更新