Clojureでは、多くのアルゴリズムがシーケンス(seqs)の観点から定義されています。シーケンスは論理的なリストであり、リストが具体的な2スロット構造で表現されるほとんどのLispとは異なり、ClojureはISeqインターフェースを使用して、多くのデータ構造がシーケンスとして要素へのアクセスを提供できるようにしています。seq関数は、コレクションに適したISeqの実装を生成します。シーケンスは、コレクションへの状態を保持するカーソルではなく、永続的で不変である点でイテレータとは異なります。そのため、foreach以上の用途があり、関数はシーケンスを消費・生成でき、スレッドセーフであり、構造を共有できます。
シーケンスライブラリの関数のほとんどは遅延評価されます。つまり、シーケンスを返す関数は、消費されるまで増分的に返し、同様にシーケンス引数も増分的に消費します。遅延シーケンスを返す関数は、lazy-seqマクロを使用して実装できます。「遅延評価」も参照してください。
Iterableを実装するオブジェクトにseqを使用する場合、結果のシーケンスは依然として不変で永続的であり、データ全体を一度だけ通過することを表します。この通過が遅延評価される可能性があるため、seqが呼び出された後に発生する変更が通過で認識される可能性があります。また、基盤となるイテレータがConcurrentModificationExceptionの影響を受ける場合、結果のシーケンスも同様に影響を受けます。seqがネイティブJava配列で使用される場合、基礎となる配列への変更はシーケンスに反映されます。完全な不変性を得るには、ソース配列をコピーする必要があります。ただし、シーケンスは複数回通過および遅延アルゴリズムをサポートするため、Iterableおよび配列でseqを使用することには多くの利点があります。堅牢なプログラムでは、seqが適用されている配列またはIterableを変更しないでください。
seqライブラリの関数の多くは、1つ以上の集合を受け取り、それらにseqを呼び出し、結果のシーケンスを操作します。つまり、これらの関数の多くは集合を受け取りますが、そのシーケンスを操作します。
これは、主要なシーケンス関数のサンプルであり、その機能別に大まかにグループ分けされています。一部の関数はさまざまな方法で使用できるため、複数のグループに表示されます。さらに多くの関数がAPIセクションにリストされています。
Clojure 1.7以降、Clojureはトランスデューサも提供しています。これは、コレクションに対する合成可能な変換のための代替モデルです。トランスデューサは、変換の入力、処理、出力部分を切り離し、core.asyncチャネルなど、より多くのコンテキストで変換の再利用を可能にします。以下のリストにあるシーケンス関数の多くは、入力コレクションが省略されている場合、トランスデューサを作成します。詳細については、トランスデューサのページを参照してください。
より長いシーケンスからより短いシーケンスを作成する関数:distinct filter remove for keep keep-indexed
より短いシーケンスからより長いシーケンスを作成する関数:cons concat lazy-cat mapcat cycle interleave interpose
先頭のアイテムが欠落しているシーケンス:rest next fnext nnext drop drop-while nthnext for
末尾のアイテムが欠落しているシーケンス:take take-nth take-while butlast drop-last for
シーケンスの並べ替え:flatten reverse sort sort-by shuffle
入れ子になったシーケンスの作成:split-at split-with partition partition-all partition-by
シーケンスの各アイテムを処理して新しいシーケンスを作成する関数:map pmap mapcat for replace reductions map-indexed seque
シーケンスから特定の番号のアイテムを抽出する関数:first ffirst nfirst second nth when-first last rand-nth
シーケンスからコレクションを構築する関数:zipmap into reduce set vec into-array to-array-2d frequencies group-by
関数の引数としてシーケンスのアイテムを渡す関数:apply
シーケンスからブール値を計算する関数:not-empty some reduce seq? every? not-every? not-any? empty?
述語を使用してシーケンスを検索する関数:some filter
遅延シーケンスの評価を強制する関数:doseq dorun doall
遅延シーケンスが強制的に評価されたかどうかを確認する関数:realized?
コレクションからの遅延シーケンス: seq vals keys rseq subseq rsubseq
生成関数からの遅延シーケンス: lazy-seq repeatedly iterate
定数からの遅延シーケンス: repeat range
他のオブジェクトからの遅延シーケンス: line-seq resultset-seq re-seq tree-seq file-seq xml-seq iterator-seq enumeration-seq