Compilers for LazyLanguages use StrictnessAnalysis to discover those portions of the code that must be executed, and implements this code using StrictEvaluation, avoiding the overhead with closure creation that is necessary to LazyEvaluation. Naturally one has to be careful about side effects. Since you're changing the order of evaluation you may change the order of side effects. Since is a major reason why LazyLanguages don't have side effects.