interpreter with lazy evaluation