lua-users home
lua-l archive

Re: Abolishing the numeric-for

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


On Tue, May 25, 2010 at 2:58 PM, Roberto Ierusalimschy
<roberto@inf.puc-rio.br> wrote:
>> Yes, that is a problem with this proposal, it adds the overhead of an
>> extra type check to every numeric for (at least it is a one-time cost,
>> not per-iteration).
>
> I cannot see how to avoid a type check at each iteration, as each
> iteration needs completely different behavior in each case.
Sorry if the description was not clear, what I meant is that a statement like:
for var_1, ···, var_n in explist do
 <block>
end
would be equivalent to the code:
do
 local e1, e2, e3 = explist
 if type(e1) == "number" then -- numeric for
 local var, limit, step = e1, tonumber(e2), tonumber(e3) or 1
 if not limit then error() end
 while (step > 0 and var <= limit) or (step <= 0 and var >= limit) do
 local v = var
 <block>
 var = var + step
 end
 else -- __iter or regular generic for
 local f, s, var = e1, e2, e3
 if type(f) ~= "function" then -- __iter metamethod
 f, s, var = metatable(f).__iter(f)
 end
 while true do -- generic for
 local var_1, ···, var_n = f(s, var)
 var = var_1
 if var == nil then break end
 <block>
 end
 end
 end
end
The values of the explist when you enter the loop decide what "kind"
of loop the for is, you can't switch from generic to numeric in the
middle of the loop.
> -- Roberto
>
--
Fabio Mascarenhas

AltStyle によって変換されたページ (->オリジナル) /