(defn my-cljs-targeting-reader-fn [form]
`(.foo ~form))
Clojurescript 的讀取器行為大多與 Clojure 讀取器相同,但在標記的文字方面存在顯著差異。
標記的文字允許使用者擴展讀取器。 請參閱 Clojure 讀取器指南中關於標記的文字的介紹。
假設我們有一個自訂的標記文字 #foo/bar
。 我們需要為想要讀取它的上下文定義讀取器函式,這將是以下一者或兩者:
Clojurescript 原始碼或 REPL 輸入
在讀取 (EDN) 資料時,在 JS 執行環境中
在這種情況下,讀取器函式在 Clojure 中執行,並且應該返回一個表示有效的 Clojurescript 的形式(類似於 Clojurescript 巨集),或是一個字面值,例如字串或數字。
(defn my-cljs-targeting-reader-fn [form]
`(.foo ~form))
這與 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