3.5 Stream

project euler からちょっと離れて SICP でストリームの勉強をしてみます。

バックグラウンド

  • gauche のドキュメントを見て stream が遅延評価を利用した無限長のリストを扱うものであるということは分かっているます。
  • 遅延評価の事は少し前に Haskell に入門したときに初めて知った。
  • SICP に関してはさらにその少し前の 2006 年に 4 章の途中まで読んだのですが、stream は飛ばして読んでました。

目的

  • 遅延評価とストリームが scheme でどう実装されるのかが分かっていないので、そこを理解する。
  • 素数の無限ストリームを作って、project euler の問題を解くのに使ってみたい。

とりあえず

3.5 節 Stream を読んでいこうと思います。

stream

cons, car, cdr のストリーム版である cons-stream, stream-car, stream-cdr の説明。ここで重要なのは本文ではなくて脚注 56 で説明されている「delay は special form である」ということだ。(cons-stream a b) を呼び出したときに b はすぐに評価されないというのがミソ。4 章で eval やってるときに if や cond も同じく special form という説明があったはずだ。