如何在ClojureScript中使用由edn reader创建的地图?

5

这段代码在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]))

当在一个新的ClojureScript REPL中运行第二个示例时,我得到了正确的答案。您使用的ClojureScript版本是什么? - Jared314
第二个例子对我也起作用,你能包含ns表单以提供上下文吗? - Arthur Ulfeldt
这让我非常惊讶。我的cljs版本是0.0-1896。你是如何在repl中让它工作的?每次我尝试(require '[cljs.reader :as reader]),都会出现编译错误。 - bmaddy
我使用了命名空间表单来在repl中引用它。 - Jared314
2个回答

2

println 的返回值是 nil,如果你使用的是 emacs 或者被记录在其他地方,那么 print 的输出很可能会进入另一个缓冲区。也许你看到的是 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

我不确定他在说什么。请注意第三个例子的结果。 - Jared314
我也不确定,这只是一个猜测和相应的工作示例。 - Arthur Ulfeldt

2

试试这个:

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

如果这样做可以生成﷐:bar,那么你可能有旧的代码残留,需要运行lein cljsbuild clean清理一下。
0.0-1877版本中发生了一个变化,将生成的javascript中的关键字从﷐:foo切换到了cljs.core.Keyword

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接