ClojureScript

阅读器

Clojurescript 阅读器的行为与 Clojure 阅读器 几乎相同,但在标记文字方面存在显著差异。

标记文字

标记文字允许用户扩展阅读器。有关标记文字的介绍,请参阅 Clojure 的 阅读器指南

阅读器函数

假设我们有一个自定义的标记文字 #foo/bar。我们需要为我们希望读取它的上下文中定义阅读器函数,这将是以下两种情况之一或两者:

  • Clojurescript 源代码或 REPL 输入

  • 在 JS 运行时读取(EDN)数据时

Clojurescript 编译

在这种情况下,阅读器函数在 Clojure 中执行,并且应该返回一个表示有效 Clojurescript 的形式(类似于 Clojurescript 宏)或一个文字,例如字符串或数字。

(defn my-cljs-targeting-reader-fn [form]
  `(.foo ~form))

这与 Clojure 阅读器函数形成对比,Clojure 阅读器函数像普通函数一样执行。

(defn my-clj-targeting-reader-fn [form]
  (.foo form))

为了在 Clojurescript 源代码中读取自定义标记文字,命名空间符号与阅读器函数相关联,这些函数位于 data_readers.cljc 文件中,如 Clojure 的 阅读器指南 中所述。如果相同的标记文字要同时用于 Clojure 和 Clojurescript,则可以在 data_readers.cljc 中使用 阅读器条件,如果针对 Clojure 与 Clojurescript 的阅读器函数不同。

读取数据

使用 EDN 阅读器时,阅读器函数只是普通的 Clojurescript 函数(意思是与读取源代码时的宏不同)。

(def custom-tag-map {'foo/bar (fn [x] (.foo x))})


(cljs.edn/read-string
    {:readers custom-tag-map}
    "#foo/bar \"abc\"")

cljs.edn/read-string 的替代方法是 cljs.reader/read-string。它只是调用 cljs.edn/read-string,但请注意,默认标签映射包括从 data_readers.cljc 中读取的映射。要使以下内容正常工作,data_readers.cljc 必须包含一个键为 'foo/bar 且值为解析为普通 Clojurescript 函数的条目。

(cljs.reader/read-string "#foo/bar \"abc\"")

原始作者:Henry Widd