lazy evaluation

Lazy evaluation is an evaluation strategy which delays the evaluation of an expression until its value is needed. The sharing can reduce the running time of certain functions by an exponential factor over other non-strict evaluation strategies, such as call-by-name, which repeatedly evaluate the same function, blindly, regardless of whether the function can be memoized.