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のソースでカスタムタグリテラルを読み込むには、名前空間付き記号が、Clojureリーダーガイドで説明されているように、data_readers.cljcファイルのリーダー関数に関連付けられます。同じタグ付きリテラルをClojureとClojurescriptの両方で使用する場合、Clojureをターゲットにする場合とClojurescriptをターゲットにする場合でリーダー関数が異なる場合は、reader条件付き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\"")

オリジナルの著者:ヘンリー・ウィッド