Exercise 3.68. Louis Reasoner thinks that building a stream of pairs from three parts is unnecessarily complicated. Instead of separating the pair (S0,T0) from the rest of the pairs in the first row, he proposes to work with the whole first row, as follows: (define (pairs s t) (interleave (stream-map (lambda (x) (list (stream-car s) x)) t) (pairs (stream-cdr s) (stream-cdr t)))) Does this work? Consider what happens if we evaluate (pairs integers integers) using Louis's definition of pairs. ———————————————————————————————————————————————————————————————————————— Mathematically Louis's version gives a correct result, however, because of evaluation order, (pairs (stream-cdr s) (stream-cdr t)) will be evaluated before interleave is called. As a result, each call to pairs will generate a new call to pairs, and no result will ever be returned. This is avoided in the original pairs implementation by using cons-stream. Alternatively, if (interleave) was implemented as a special form like if or cond, which only evaluated the second argument once the second result element was requested, then this would work.