lua-users home
lua-l archive

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

Sorry to bring this up yet again, but I just realised the solution offered by LHdeF does not work in the general case.


I am trying to write an object oriented library in which you can have objects for which the following is valid:


for v in obj do ... end


Using the __call metamethod you can easily get to:


for v in obj() do ... end


But the redundant parenthesis rankles. LHdeF suggested:


setmetatable(obj, {__call = function(x,y,z) return next(x,z) end})


Which enables:


for k, v in obj do ... end


Trouble is this only works when the key (k) is exposed in the generic for. I cannot see any way of making it work for a stateless iterator. Thus while it works well for table-like objects it is no good for list-like or set-like  objects were the key is irrelevant and should be hidden.


Furthermore, “consuming” the __call metamethod for this purpose is a “bodge” – it precludes its use for the intended purpose and it generates odd side-effects if it is accidentally invoked in other contexts.


So we are back were we started (or have I missed something?) – what is needed is a new metamethod which is invoked when the explist of a generic for fails to resolve a function in its first slot. The object designer could put an iterator factory function in this slot which can return any form of iterator including stateless.


I really cannot see why this solution is resisted – it is fully backward compatible and syntactically uncomplicated. The context of the explist is easily distinguishable being bracketed by the reserved words ‘in’ and ‘do’.