clojure.datafy
値をデータに変換し、データからそれが表すものへたどる名前空間で、clojure.core.protocols の
プロトコルの上に成り立っています。clojure.datafy を require すると使えます。clojure.core.protocols
は Clojure と同じくプログラムより先に読み込まれており、修飾名なら require なしで届きます。どちらも
Clojure の同名の名前空間について文書化された振る舞いをもとに rontolisp 向けに書いた Clojure ソースで、
すべてのバックエンドで同じように動きます。
| var | 振る舞い |
|---|---|
clojure.datafy/datafy | (datafy x): Datafiable を通した x のデータ表現。新しいコレクションが返ったときは、そのメタデータの :clojure.datafy/obj に x を、:clojure.datafy/class にそのクラスのシンボルを入れる。例外は Throwable->map のマップ、アトム・ref・エージェントはメタデータ付きの [値] を返す |
clojure.datafy/nav | (nav coll k v): coll の k の位置にある v が表すもの。Navigable を通し、拡張されていなければ v 自身 |
clojure.core.protocols/Datafiable、datafy | datafy のもとになるプロトコル。nil もほかの値も自分自身を返す。メタデータで拡張できる |
clojure.core.protocols/Navigable、nav | nav のもとになるプロトコル。メタデータで拡張できる |
clojure.core.protocols/CollReduce、coll-reduce | (coll-reduce coll f) / (coll-reduce coll f val): コレクション自身による reduce。これを拡張した record・deftype・reify は、reduce・into・transduce など reduce の上に作られた動詞でもこれを通して畳み込まれる(reduce) |
clojure.core.protocols/IKVReduce、kv-reduce | (kv-reduce amap f init): コレクション自身による reduce-kv。これを拡張した record・deftype・reify には reduce-kv・update-vals・update-keys が届く |
clojure.core.protocols/InternalReduce、internal-reduce | (internal-reduce s f start): プロトコルとしてのシーケンスの reduce |
メタデータで拡張できるプロトコルは、値のメタデータのうちメソッドの修飾シンボルのキーにあるメソッドを、 拡張より先に使います。
型は自前の CollReduce や IKVReduce の行を通して畳み込まれます。
違い
iterator-reduce!は組み込まれていません(java.util.Iteratorを畳み込む関数です)。名前を使うと そのことを告げるエラーになります。reduceとreduce-kvがCollReduceとIKVReduceを参照するのは record・deftype・reifyに 対してだけです。どちらかのプロトコルをnil、Object、コアの種類(String、マップ)へ拡張した ものには、coll-reduceやkv-reduceを直接呼んで届きます。Clojure のreduceは、自分では 畳み込まないコレクション(文字列、マップ)についてもその拡張を使います。reduceはInternalReduceを参照しません。- 名前空間やクラスは自分自身にデータ化されます(Clojure はメンバーのマップを返します)。例外の マップにはフレームがありません(Throwable->map)。