SICP — Scheme/JS Structure and Interpretation of Computer Programs — Comparison Edition

[1] Assignment introduces a subtlety into step 1 of the evaluation rule. As shown in exercise 3.8, the presence of assignment allows us to write expressions that will produce different values depending on the order in which the subexpressions in a combination are evaluated. Thus, to be precise, we should specify an evaluation order in step 1 (e.g., left to right or right to left). However, this order should always be considered to be an implementation detail, and one should never write programs that depend on some particular order. For instance, a sophisticated compiler might optimize a program by varying the order in which subexpressions are evaluated. The ECMAScript standard specifies evaluation of subexpressions from left to right.
[2] Reassignment introduces a subtlety into step 1 of the evaluation rule. As shown in exercise 3.8, the presence of reassignment allows us to write expressions that will produce different values depending on the order in which the subexpressions in a combination are evaluated. To eliminate such ambiguities, Python specifies left-to-right evaluation of the subexpressions of combinations and of the argument expressions of applications.
[3] If there is already a binding for the variable in the current frame, then the binding is changed. This is convenient because it allows redefinition of symbols; however, it also means that define can be used to change values, and this brings up the issues of assignment without explicitly using set!. Befcause of this, some people prefer redefinitions of existing symbols to signal errors or warnings.
3.2.1   The Rules for Evaluation