alternative eval' definition traversing the expression just once, even under lambdas