Lazy evaluation can also be encoded fairly easily in strict languages using constructs like lazy stream abstractions.
In case anyone is unaware, LINQ lets you represent queries as a series of function calls which it represents as a series of Expression objects and an in-memory AST.