Laziness is an efficient method of getting normal-order reduction semantics (i.e., non-strict semantics) for functional programming languages. By separating data from control, laziness makes functional programming languages more expressive.
I will explain what laziness is and compare it to other reduction orders. I will explain why laziness is a desirable feature of a functional programming language and what are the disadvantages of laziness. I will then look at ways to implement lazy languages, in particular, the G-Machine.