|
Francisco Olarte:
From what I see: stat ::= varlist ‘=’ explist varlist ::= var {‘,’ var} explist ::= exp {‘,’ exp} It looks like the "expressions" refer only to the RHS ones. Somewhere above vars are defined using prefixexp and exp , and a comment stating that may be clarifying. I think it may be a lack of detail. The manual, IMO, is trying to say that up.x,up.y=up.y,up.x works somehow like a=up.y, b=up.x, up.x=a, up.y=b, which may not be obvious. In fact your example, from what I read, is behaving correctly with all the exp, and is hitting the var[exp] variant of prefixexp correctly preevaluating the exp part, but failing on the var part.
So node.next, node = new, newcould also not evaluate the node from node.next before node is assigned to new, however, this case is explicitly checked in https://github.com/lua/lua/blob/9db4bfed6bb9d5828c99c0f24749eedf54d70cc2/lparser.c#L1330. Why even do this check in the first place if the prefix-expression parts do not need to be evaluated before the assignments? Further, from https://www.lua.org/manual/5.4/manual.html#3.4 I would assume that prefixexp are also expressions.
And if by expressions only the RHS is meant the example: Thus the code i = 3 i, a[i] = i+1, 20sets a[3] to 20, without affecting a[4] because the i in a[i] is evaluated (to 3) before it is assigned 4.
would be wrong, as i could be assinged 4 before a[i] is evaluated.It would be nice to know how this is meant to work as the my example is a bit contrived, however, this could happen in a more complex __newindex metamethod which for example calls to other hook functions.
Regards, Xmilia