你如何在clojurescript中使用edn阅读器创建的地图?

时间:2013-09-26 22:33:27

标签: clojure clojurescript edn

按照我的预期在 Clojure 中打印:bar

(println (:foo (clojure.tools.reader.edn/read-string "{:foo :bar}")))
;=> :bar

但是这会在 ClojureScript 中打印nil

(println (:foo (cljs.reader/read-string "{:foo :bar}")))
;=> nil

为了让事情变得陌生,我会按照我的预期在 ClojureScript 中打印:bar

(let [data (cljs.reader/read-string "{:foo :bar}")]
  (println ((first (keys data)) data )))
;=> :bar

如何访问由阅读器创建的地图中的值?这是字符编码吗?

修改

以下是评论中要求的命名空间:

(ns clojuresite.homepage
  (:require-macros [hiccups.core :as hiccups])
  (:require [hiccups.runtime :as hiccupsrt]
            [cljs.nodejs :as node]
            [cljs.reader :as reader]))

2 个答案:

答案 0 :(得分:2)

println的返回值为nil 如果您正在使用emacs或在其他地方记录,则打印输出可能会进入另一个缓冲区。也许你看到println的返回值而不是它的输出。

ClojureScript:cljs.user> (ns cljs.user (:require [cljs.reader :as edn]))
nil
ClojureScript:cljs.user> (println (:foo (cljs.reader/read-string "{:foo :bar}")))
:bar
nil

VS

ClojureScript:cljs.user> (:foo (cljs.reader/read-string "{:foo :bar}"))
:bar

答案 1 :(得分:2)

试试这个:

(.log js/console
  ((keyword "foo") (cljs.reader/read-string "{:foo :bar}")))

如果可行,并生成﷐:bar,则会生成旧的生成代码,您应该运行lein cljsbuild clean

0.0-1877中,生成的javascript中的关键字从﷐:foo转换为cljs.core.Keyword后发生了变化。