Clojureメタは、関数がそのように気を配り、Clojureのコア関数がメタをグローバルに保存しない場合にのみ保持されます。私が聞いた経験則は、conj、assocなどのコレクション関数はメタを保持すると考えられていますが、map、filter、takeなどのシーケンス関数はメタを保持しないということです。Clojureコアのどの機能がメタを保持しますか?
メタ機能を保持する関数のリストがありますか?
Clojureメタは、関数がそのように気を配り、Clojureのコア関数がメタをグローバルに保存しない場合にのみ保持されます。私が聞いた経験則は、conj、assocなどのコレクション関数はメタを保持すると考えられていますが、map、filter、takeなどのシーケンス関数はメタを保持しないということです。Clojureコアのどの機能がメタを保持しますか?
メタ機能を保持する関数のリストがありますか?
すべての種類についてです。シーケンス関数は引数にseq
を呼び出すのと同じように動作し、したがって常に同じ型のオブジェクトを返すわけではありません。コレクション関数と型固有関数は、seqを呼び出して、与えられたものと同じ型のオブジェクトを返しません。それは、実際にはそうでないとしても、同じオブジェクトを返すという錯覚を与えるようなものです(これは、この動作のための推論かもしれません)。経験則では、型が保持されるときに関数がメタを保持するということができます。
user> (meta (seq (with-meta (list 1) {:a 1})))
{:a 1}
user> (meta (seq (with-meta (vector 1) {:a 1})))
nil
怠惰が厳しい関与しているときに注意するようにしてください:コレクションにメタを維持する機能のリストについては
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
、data structuresページを参照してください。メタを保持しないものはsequencesページの下にありますが、同じタイプのオブジェクトを返すときは例外です。私は怠惰ので、詳細についてはかなりよく分からないフードとチャンクシーケンスの下
が追加されましたが、あなたはRT
クラスからcons
、seq
とseqFrom
方法で見ることができます。メタデータを保存しない関数は、これらのメソッドを実行します。コレクション関数は、その型固有のメソッドを使用して終了します。