【问题标题】:Clojure edn read auto namespaced keywordsClojure edn 读取自动命名空间关键字
【发布时间】:2016-07-26 15:12:39
【问题描述】:

有没有办法指导clojure.core.edn/read 如何解析自动命名空间关键字?

  (edn/read-string "{:not-namespaced \"ko\" }") ;;=> {:not-namespaced "ko"}
  (edn/read-string "{:namespaced/ok \"ko\" }")  ;;=> #:namespaced{:ok "ko"}
  (edn/read-string "{::namespaced \"ko\" }")    ;;=> Unhandled java.lang.RuntimeException Invalid token: ::namespaced autonamespaced does not work

最后一个例外是有道理的,因为"A keyword cannot begin with ::"

我可以在这个简单的示例中使用load-file,但是我还需要edn 的可扩展性(读取自定义标签)。

有一个参数来指示如何解析命名空间将使我的配置文件(强制使用clojure.spec)更具可读性。

【问题讨论】:

  • 您是否尝试过使用clojure.core/read-string
  • @OlegTheCat 有趣,我没有!不过,我必须深入研究它的选项图。
  • @OlegTheCat 据我现在了解,clojure.core/read-string 不会让我拥有像 edn 这样的读者。这将阻止我在github.com/juxt/aero 中定义配置(否则可以工作)。
  • @nha 也许tools.reader 可以满足您的需求?不过,我自己没有使用过,所以我可能是错的。

标签: clojure edn


【解决方案1】:

所以在我的情况下,最简单的解决方案是在我的配置文件中使用带有非命名空间关键字的 clojure.spec(我不知道它可以做到这一点)。

使用核心阅读器功能也可以。

Alex Miller 在 slack 上的引述:

是的,您需要 edn 配置文件中的完整命名空间您也可以 使用 req-un 和 opt-un 为不合格的键编写规范

应该是普通的核心阅读器 fns 或 clojure.edn 阅读器 fns 能够阅读带标签的文字#你只需要绑定 围绕调用设置阅读器

【讨论】:

    【解决方案2】:

    我喜欢在解析字符串之前对其进行转换,以保持 edn 文件干净,而不必将规范键视为不合格。

    (-> "{::namespaced \"ko\" }"
        (#(string/replace % #"::" ":some.namespace/"))
        (edn/read-string))
    

    这在编写和重新读取 edn 文件时可能不是很健壮,但对于配置数据来说效果很好。

    【讨论】:

      猜你喜欢
      • 2011-02-28
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      相关资源
      最近更新 更多