(defn my-cljs-targeting-reader-fn [form]
`(.foo ~form))
Clojurescript 阅读器的行为与 Clojure 阅读器 几乎相同,但在标记文字方面存在显著差异。
标记文字允许用户扩展阅读器。有关标记文字的介绍,请参阅 Clojure 的 阅读器指南。
假设我们有一个自定义的标记文字 #foo/bar
。我们需要为我们希望读取它的上下文中定义阅读器函数,这将是以下两种情况之一或两者:
Clojurescript 源代码或 REPL 输入
在 JS 运行时读取(EDN)数据时
在这种情况下,阅读器函数在 Clojure 中执行,并且应该返回一个表示有效 Clojurescript 的形式(类似于 Clojurescript 宏)或一个文字,例如字符串或数字。
(defn my-cljs-targeting-reader-fn [form]
`(.foo ~form))
这与 Clojure 阅读器函数形成对比,Clojure 阅读器函数像普通函数一样执行。
(defn my-clj-targeting-reader-fn [form]
(.foo form))
使用 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