another piece of the puzzle: lazy evaluation is just TOO lazy for its own good, without memoization