make expr a by-name parameter for better behavior