[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: idea: __iter generic-for metamethod
- From: "Stuart P. Bentley" <stuart@...>
- Date: Mon, 24 May 2010 17:26:27 -0700
Going from a post Joonas just made, it should actually read like this:
A for statement like
for var_1, ···, var_n in explist do block end
is equivalent to the code:
do
local f, s, var = explist
--proposed addition
if type(f)~= "function" and not metatable(f).__call then
local meta_f = metatable(f).__iter
if not meta_f and type(f)=="table" then meta_f = pairs
if meta_f then f, s, var = meta_f(f) end
end
while true do
local var_1, ···, var_n = f(s, var)
var = var_1
if var == nil then break end
block
end
end
(I'd forgotten that __call could be used to replicate the non-factory
version of __iter.)
On Mon, 24 May 2010 17:06:09 -0700, Stuart P. Bentley
<stuart@testtrack4.com> wrote:
On Mon, 24 May 2010 16:53:32 -0700, Jonathan Castello
<twisolar@gmail.com> wrote:
I wrote your algorithm into a usable Lua function to try it out. I had
to add a check for nonexistent metatables, but it does work.
From the manual:
"The code shown here in Lua is only illustrative; the real behavior is
hard coded in the interpreter and it is much more efficient than this
simulation. All functions used in these descriptions (rawget, tonumber,
etc.) are described in §5.1. In particular, to retrieve the metamethod
of a given object, we use the expression
metatable(obj)[event]
This should be read as
rawget(getmetatable(obj) or {}, event)"