TL;DR
Clojure で、要素が必要になったときに初めて計算されるシーケンス。遅延評価をシーケンスに適用したものである。
仕組み
Clojure の公式リファレンスによると、シーケンスを返す関数は、消費されるのに合わせて少しずつ値を返し、引数のシーケンスも少しずつ消費する。lazy-seq マクロで作ったコレクションは、最初に seq が呼ばれたときだけ本体を実行し、結果をキャッシュする。
遅延シーケンスを返す関数には、コレクションから作る seq、keys、vals、生成関数から作る lazy-seq、repeatedly、iterate、定数から作る repeat、range などがある。評価を強制するには doseq、dorun、doall を使う。realized? で評価済みかを確かめられる。
注意点
遅延シーケンスは、空であっても nil とは限らない。空かどうかは真偽値として扱わず、seq で確かめる。また、シーケンスの先頭への参照を持ち続けると、計算済みの要素がメモリに残り続ける。