first
およびsayのドキュメント文字列はrest
、これらの関数が引数を呼び出すことで、ベクトルやセットなど、それ自体が seq ではない seqable コレクションを渡すときに自分自身seq
を呼び出す必要がないという考えを伝えます。seq
例えば、
(first [1 2 3])
;= 1
引数をfirst
呼び出さないと機能しません。seq
あなたは言わなければならないでしょう
(first (seq [1 2 3]))
代わりに、これは不便です。
両方ともtake
引数をdrop
呼び出しseq
ます。そうしないと、上記で説明したように、ベクトルなどでそれらを呼び出すことができません。実際、これはすべての標準的な seq コレクションに当てはまります。直接呼び出さないものは、呼び出すseq
下位レベルのコンポーネントに基づいて構築されています。
これにより、レイジー seq の遅延性が損なわれることはありません。first
/呼び出しの結果として発生する強制 / 実現rest
は、要求された結果を得るために可能な最小量です。(それがどの程度かは、引数の型によって異なります。実際に遅延していないfirst
場合、呼び出しに追加の実現は含まれません。部分的に遅延している場合、つまりチャンクされている場合は、追加の実現が行われます。 (最大 32 の初期要素が一度に計算されます); 完全に遅延している場合、最初の要素のみが計算されます。)
明らかfirst
に、lazy seq が渡された場合、その最初の要素の実現を強制する必要があります。これが要点です。rest
は、実際には seq の「残りの」部分の実現を実際に強制しないという点で、やや怠惰です (next
これは、基本的に と同等である とは対照的です(seq (rest ...))
)。すぐにスキップできるように最初の要素を強制的に実現するという事実は、遅延 seq オブジェクトの不必要なレイヤー化と元の seq のヘッドの保持を回避する意識的な設計上の選択です。レイジー seq ラッパーが実現さ(lazy-seq (rest xs))
れるまで保持することを犠牲にして、この最初の実現でさえ延期するようなことを言うことができます。xs