ClojureScript

讀取器

Clojurescript 的讀取器行為大多與 Clojure 讀取器相同,但在標記的文字方面存在顯著差異。

標記的文字

標記的文字允許使用者擴展讀取器。 請參閱 Clojure 讀取器指南中關於標記的文字的介紹。

讀取器函式

假設我們有一個自訂的標記文字 #foo/bar。 我們需要為想要讀取它的上下文定義讀取器函式,這將是以下一者或兩者:

  • Clojurescript 原始碼或 REPL 輸入

  • 在讀取 (EDN) 資料時,在 JS 執行環境中

Clojurescript 編譯

在這種情況下,讀取器函式在 Clojure 中執行,並且應該返回一個表示有效的 Clojurescript 的形式(類似於 Clojurescript 巨集),或是一個字面值,例如字串或數字。

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

這與 Clojure 讀取器函式形成對比,後者像一般函式一樣執行。

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

為了在 Clojurescript 原始碼中讀取自訂的標記文字,命名空間符號會與 data_readers.cljc 檔案中的讀取器函式關聯,如 Clojure 讀取器指南中所述。 如果相同的標記文字將用於 Clojure 和 Clojurescript,則如果針對 Clojure 與 Clojurescript 的讀取器函式不同,則可以在 data_readers.cljc 中使用 讀取器條件式

讀取資料

當使用 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