 A lazy sequence is a sequence type in which the elements are not stored, but rather generated as needed by an encapsulated function. One reason to use lazy sequences is that they effectively defer work. Rather than generating all the values of a sequence upfront, we can create a lazy sequence that generates the values only as needed. This spares our code from wasted work when the whole sequence never ends up getting read. Standard library functions generally return lazy sequences instead of non-lazy sequences for this reason. Another reason to use lazy sequences is that they may represent an infinite number of values. Because the values are only generated as needed, they aren't stored in memory and so we can have a lazy sequence that, say, represents every integer from 0 up to infinity. You should be careful when dealing with lazy sequences of infinite length because any operation that attempts to read the whole sequence will of course never succeed and so effectively hang your program. For example, simply invoking count on an infinite sequence will hang your program because count will attempt to iterate through all the values of the sequence. It's really easy to run afoul of this problem when using the closure command line because the command line prints the result of each expression, and if that result is an infinite lazy sequence or an object that contains an infinite lazy sequence, then printing the result will effectively hang the command line. For creating the most commonly used kinds of lazy sequences, closure provides a few convenient functions. The range function returns a lazy sequence of integers that span a specified range. The repeat function returns an infinite lazy sequence that repeats a value. The repeatedly function returns an infinite lazy sequence of values generated by calls to a given function. The iterate function is, like, repeatedly, but each call to the function takes the previous element as argument, and the cycle function returns an infinite lazy sequence that repeats the elements of some other sequence. Looking at some example uses, this call to range with no arguments returns an infinite lazy sequence of the integers from 0 to infinity. The second call returns an infinite lazy sequence that starts at 3 and continues to infinity, and this third call returns a finite lazy sequence that starts at 2 and stops at 10. If we provide three arguments to range, the third argument specifies a step by which to increment. A step of 1 is the same as the default, but a step of 3 skips over every two integers. When the step is negative, the range counts down rather than up. The step needn't be an integer, as we see in the last example where the sequence counts up by 0.5. As for the repeat function, this first call returns an infinite lazy sequence of nothing but the value 5. The second call returns a finite lazy sequence of the value 5 repeated just three times. The first call to repeatedly here returns an infinite lazy sequence of values created by calling the rand function, which returns a random number between 0.0 and 1.0. The second call returns a finite lazy sequence of just three random numbers. This call to cycle returns an infinite lazy sequence that repeats the elements of the vector addInfinitem. Lastly, this call to iterate returns an infinite lazy sequence in which the first element is the provided value, but then subsequent values are produced by invoking the provided function deck with the previous element. So from the initial value 2 we get 1, then from 1 we get 0, and so forth.