Clojure Core Preserve Metaの機能は何ですか?
質問
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
, seq
と seqFrom
からの方法 RT
クラス。メタデータを保存しない関数は、これらの方法を通過します。一方、コレクション関数は、タイプに固有の方法を使用することになります。
所属していません StackOverflow