maintain the correct evaluation order