I see no reason to require evaluation order of arguments when there is already a mechanism to enforce it: use LET* where evaluation order is important. A good compiler should be able to optimize away the implied temporaries when the expressed evaluation order matches the implementation evaluation order.