【问题标题】:How do you use maps created by the edn reader in clojurescript?您如何在 clojurescript 中使用由 edn 阅读器创建的地图?
【发布时间】:2013-09-27 09:17:40
【问题描述】:

这会在 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

如何访问由阅读器创建的映射中的值?这是字符编码的事情吗?

编辑

这是 cmets 中请求的命名空间:

(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 版本?
  • 第二个例子也适用于我,你能在上下文中包含 ns 表单吗?
  • 这对我来说真的很令人惊讶。我的 cljs 版本是 0.0-1896。你是如何让它在 repl 中工作的?每次我尝试(require '[cljs.reader :as reader]) 时都会出现编译错误。
  • 我使用命名空间形式在repl中要求它。

标签: clojure clojurescript edn


【解决方案1】:

试试这个:

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

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

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

【讨论】:

    【解决方案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
    

    对比:

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

    【讨论】:

    • 我不确定他在说什么。注意第三个例子的结果。
    • 我也不确定,这只是一个猜测和一个附带的工作示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    相关资源
    最近更新 更多