DISCLAIMER: I'm just wondering about this topic
table.pack() is used to pack "the stack", that can hold nils. To accomplish this behaviour it uses the ".n" field (I'm not analysing the merit here). Since this is somewhat arbitrary, look this example:
table.packs = function(...)
local len = select('#',...)
return setmetatable({...},{
__len = function() return len end,
__newindex = function(t,k,v)
if math.type(k) == 'integer' then
len = math.max(len,k)
end
rawset(t,k,v)
end
})
end
that returns an effective sequence (defined by #) compatible with "the stack", even if ... initiate/terminate with 'nils'. This is symmetric with table.unpack and all table.something() that use # behaves as expected. (am I wrong?)