• Subject: Lua5.0 new "For" question
• From: "Peter Hill" <corwin@...>
• Date: Sun, 22 Dec 2002 15:56:20 -0000

I've been having a look through the Lua5.0(beta) documentation and noticed
the new general "for" statement. What I want to know is why the "pair"
function exists?

Ie, why do we write:
a = {"alpha", "beta"}
for i,v = pair(a) do print(v) end

Wouldn't it be just as fine to say:
a = {"alpha", "beta"}
for i,v = next,a do print(v) end

The above should be just the same as as the internal assignments:
_f, _s, i, v = pair(a)
and
_f, _s, i, v = next, a

----

Which brings up a separate issue regarding the exp/exp1 situation. If I
wanted to specify the initial index value in a "for" how would I? Surely:
for i,v = pair(a),123 do print(v) end

would fail because, as a non-terminal in the assignment, "pair()" would be
chopped down to a single return value, effectively becoming:
_f, _s, i, v = next, 123

rather than the desired:
_f, _s, i, v = next, a, 123

I'm sure some way of allowing non-terminal exp (vs exp1) has been mentioned
before (no doubt ad-nausem) but in a case like this how does one get by
without it?

The generally solution would be to have some sort of return-value compiler
directive. Eg, let's use "#" (being the "number" sign) which we define as:
n # f() -- truncate (or expand with "nil") to n values.
# f() -- use all return values
f() -- use one return value... same as 1#f()

Thus, my problem above would become:
for i,v = #pair(a),123 do print(v) end

Note that I would probably also like to redefine the default assignment &
parameter expressions to be "[exp1 {,exp1}]" rather than the current "[[exp1
{,exp1}] exp]". Ie, ALL functions (terminal or non-terminal) are trimmed to
one return value, regardless of position, unless explicity specified
otherwise.

True, it's not compatible with the current method... but it's a lot clearer
and fairly easy to adjust code to. Otoh, one could always add a global
variable in Lua to specify which default one wants, eg "_TERMINAL_EXP =
true".

*cheers*
Peter Hill.