TL;DR

  • シーケンスは特定の実装の詳細と結びつかない論理的なリストであり、Clojure はあらゆるデータ構造をこの単一の抽象で扱う。
  • シーケンスとみなせるコレクションをシーカブル(seq-able)と呼び、シーケンスライブラリはシーカブルなデータなら何でも扱える。

内容

シーケンス(sequence)とは

プログラムはデータを扱う。最下層にあるのは、文字列やリスト、ベクタ、マップ、集合、ツリーなどの具体的なデータ構造である。より上層に目を向けると、抽象化の結果として同じデータ構造が何度も現れる。いくつか例を挙げる。

  • XML のデータはツリーでもある
  • DB への問い合わせ結果はリストやベクタとみなせる
  • ディレクトリ階層はツリーである
  • ファイルは 1 つの巨大な文字列ともみなせるし、各行を要素とするベクタともみなせる

Clojure では、これらすべてのデータ構造を単一の抽象(シーケンス: seq)で扱う。

シーケンスは論理的なリストである。論理的というのは、Clojure のシーケンスは Lisp のコンスセルのような特定の実装の詳細とは結びついていないということである。つまり、シーケンスはあらゆる場所で扱える抽象化である。

シーカブル(seq-able)とは

シーケンスとみなせるコレクションを seq-able と呼ぶ。この章では、様々なシーカブルなコレクションを見ていく。

  • すべての Clojure コレクション
  • すべての Java コレクション
  • Java の配列と文字列
  • 正規表現のマッチ結果
  • ディレクトリ構造
  • I/O ストリーム
  • XML ツリー

シーケンスライブラリ

シーカブルなデータなら何でも扱える関数を集めた、シーケンスライブラリも見ていく。このライブラリには、データを生成し、選択し、変換する関数群がある。これらは命令型言語でループが必要な場面の多くを置き換えるものでもある。

キーワード

自分の理解

Lisp のコンスセルは、リスト構造を表現するための基本的なデータ構造である。Clojure のシーケンスはこのように特定のデータ構造に依存していないので、リスト以外のデータ構造もシーケンスとして扱える。