Clojureにおける遅延シーケンスは非常に便利だが、繰り返し処理の中で用いたときに気づきにくいバグを生み出すことがある。以前、この問題にはまったことがあるので、ここにまとめておく。 本稿でとりあげる問題はStuart Sierra氏の記事[1]でも触れられており、一部サンプルコードを参考にしている。なお、本稿ではClojure 1.8を利用している。 問題例として、concat関数を用いる。concatは、引数として2つのコレクションを受け取り、その中身をつなげて1つのシーケンスとして返す関数である。複数のコレクションをつなぎ合わせる処理はよく登場するため、Clojureを使っている人なら日常的に使用している関数のはずだ。 (concat [1 2] [3 4]) ;; => (1 2 3 4) しかしこの関数は、使う場所によっては非常に気づきにくいバグを生み出すことがある。その問題は、

