I do abuse it often but when I have faced this feature first time I was really suprised:
i = 0;
(i++; # - i) & /@ Range[5]
{0, 0, 0, 0, 0}
What am I asking about is how do we know Map
will do 'mapping' position after position? Of course it might look logical but it is not stated, and then, since I know nothing about memory allocation etc., I could expect strange results. To be more precise, I could expect them only in cases where mapping funcion is changing during mapping.
I have failed to find a word in documentation, only related but not important in this case:
Leaves are visited before roots
Have I missed something?
Answer
I'm afraid my comment was too obscure to be noticed. Further, I disagree with one premise somewhere in the commentary, and I wish to make a fuller explanation to see if I understand correctly or incorrectly. Finally, I think the question is answered in the documentation on the Standard Evaluation Procedure:
- Evaluate the head of the expression.
- Evaluate each element in turn.
- Apply transformations associated with the attributes Orderless, Listable, and Flat.
- Apply any definitions that you have given.
- Apply any built-in definitions.
- Evaluate the result.
The first two implies that parts 0, 1, 2,... will be evaluated in order (unless one cavils that "in turn" does not imply order).
When Map[f, {1, 2, 3}]
is evaluated, we get, after Map
, f
, and {1, 2, 3}
are evaluated,
{f[1], f[2], f[3]}
Next this List
is evaluated, with f[1]
, f[2]
, f[3]
being evaluated in turn. Thus with the OP's function, the side effect on i
is defined. Trace
will show that what happens conforms to standard evaluation (of course).
Note that the mapping part (applying f
to each element of {1, 2, 3}
) might be done in any order. What matters is that the intermediate list {f[1], f[2], f[3]}
is then evaluated in a defined order (left-to-right).
So, I think this behavior is defined by the documentation.
Edit: An additional Reference
In the tutorial on Evaluation, it states in "an expression like h[Subscript[e, 1], Subscript[e, 2]\[Ellipsis]]
, Mathematica evaluates "each element Subscript[e, i]
in turn." I think the "in turn" with the reference to the subscript i
must mean in the natural order of 1, 2,.... There always seem to be questions of interpretation in documentation, but if writers did not mean that, I think they could be fairly criticized for misleading users, which I doubt they are.
Comments
Post a Comment