SICP問題3.68

Louis Reasonerが定義したpair手続き

(define (pairs s t)
  (interleave 
   (stream-map (lambda (x) (list (stream-car s) x))
               t)
   (pairs (stream-cdr s) (stream-cdr t))))

この定義は動くか?Louis の piars 手続きを使って(pairs integers integers)を評価すると何が起きるか?

実際に以下のように実行すると

(stream-ref-range (pairs integers integers) 0 50)

結果は返って来ない。
これはinterleave の第二引数としてpairsが再帰的に呼び出されるが、元の実装のように cons-stream 等で delay をかけていないため、pairsが即座に評価され、再度pairsが呼び出されるという無限ループとなり、結果が返って来ないためである。