On Page 104 you describe several ways to define lazy streams in general or the stream of the fibonacci numbers in general.
I propose to demonstrate the definition of streams as the fixed point of a given function which maps a stream to another stream. The given function must be a productive function, i.e. a function,
that can generate at least the beginning of a sequence.
(defn fixedpoint [f]
(letfn
[(stream [ ] (lazy-seq (f (stream))))]
(stream))
)
Let’s define some examples, e.g. the stream of zeros, ones, or the stream of alternating zero and ones:
(set! *print-length* 20)
(def zeros (fixedpoint (fn [s] (cons 0 s))))
(def ones (fixedpoint (fn [s] (cons 1 s))))
(def zeroone (fixedpoint (fn [s] (cons 0 (cons 1 s)))))
but more interesting is the definition of the stream of integers
(def ints (fixedpoint (fn [s] (cons 0 (map inc s)))))
and the stream of fibonacci numbers
(def fibs (fixedpoint (fn [s] (cons 0 (map + s (cons 1 s))))))
For me, this definition is very simple and clear.
Best wishes
Dominik