[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: __pairs metamethod - is it in?
 
- From: Mark Hamburg <mhamburg@...>
 
- Date: Thu, 03 Feb 2005 16:26:19 -0800
 
I'm not sure I've seen a concrete proposal, so here goes:
    local raw_next = next
    local raw_ipairs = ipairs
    pairs = function( t )
        local mt = getmetatable( t )
        local mt_pairs = mt and mt.__pairs
        if mt_pairs then
            return mt_pairs( t )
        else
            mt_next = ( mt and mt.__next ) or raw_next
            return mt_next, t
        end
    end
    next = function( t, k )
        local mt = getmetatable( t )
        local next_imp = ( mt and mt.__next ) or raw_next
        return next_imp( t, k )
    end
    ipairs = function( t )
        local mt = getmetatable( t )
        return ( ( mt and mt.__ipairs ) or raw_ipairs )( t )
    end
This actually needs to be C code so that it can see protected metatables.
It's a little ugly having to patch both __pairs and __next, but so it goes.
In fact, one could argue that all of the standard table manipulation
routines should support this approach with the old versions potentially
exported in a rawtable namespace. So, consider the point argued.
The argument for adding these metamethods is that they work in support of
Lua's use of proxy tables.
Is there a strong against adding these metamethods?
I do go both ways on whether to export all of the raw routines. In
particular, pairs and table.foreach can be used to discover keys that one
might want to keep undiscoverable.
Mark