質問

Clojure Metaは、関数がそうするように注意し、Clojureコア関数がメタをグローバルに保存しない場合にのみ保存されます。私が聞いた一般的な経験則では、CONC、ASSOCなどのコレクション関数はメタを保存することになっていますが、MAP、フィルター、テイクなどのシーケンス関数はメタを保存しないということです。

どの機能がメタを保持するかのどこかにリストがありますか?

役に立ちましたか?

解決

それはすべてタイプです。シーケンス関数は、彼らが呼ぶように機能します seq 彼らの議論については、常に同じタイプのオブジェクトを返すとは限りません。コレクション関数と型固有の関数は、SEQを呼び出し、それらに与えられたものと同じタイプのオブジェクトを返しません。それは、たとえそうでなくても、同じオブジェクトを返すという幻想を与えます(これがこの動作の理由かもしれません)。経験則は、関数がメタがタイプを保持するときに保存するということです。

user> (meta (seq (with-meta (list 1) {:a 1})))
{:a 1}
user> (meta (seq (with-meta (vector 1) {:a 1})))
nil

怠lazが厳しいときに必ず注意してください:

user> (type (list 1))
clojure.lang.PersistentList
user> (type (map identity (list 1)))
clojure.lang.LazySeq
user> (meta (seq (with-meta (map identity (list 1)) {:a 1})))
nil

コレクションにメタを保持する関数のリストについては、 データ構造 ページ。メタを保存していないものは下にあります シーケンス ページは、同じタイプのオブジェクトを返す場合を除きます。

ボンネットの下で、怠lazとチャンクされたシーケンスが追加されているので、詳細についてはよくわかりませんが、 cons, seqseqFrom からの方法 RT クラス。メタデータを保存しない関数は、これらの方法を通過します。一方、コレクション関数は、タイプに固有の方法を使用することになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top