Clojure Programming/Examples/Lazy Fibonacci

A function which lazily produces Fibonacci numbers:

Recursive Version
A version with recursion on data, not functions. see http://en.wikipedia.org/wiki/Corecursion :

A different recursive version, making use of the reductions function. ... Does this work? NO. Seems a fake. See discussion.

Properly Scoped Version
There might be a problem in the precedent versions : they create fibonacci lazy-sequences that are bound to top level vars. And as such they are not garbage collected, and if used to compute a very long sequence, will consume a lot of heap. It could be smarter to define fib-seq as a no-arg function that will return a lazy-seq on demand. Then the lazy seq could be put by the caller in the appropriate scope (hopefully not the top level scope) :

Using iterate
We can use iterate to generate pairs of [a b] and then take the first of each one.

This example also uses destructuring.

Self-Referential Version
Computes the Fibonacci sequence by mapping the sequence with itself, offset by one element.