--[[-- num_args takes in 5.1 byte code and extracts the number of arguments from its function header. --]]-- function int(t) return t:byte(1)+t:byte(2)*0x100+t:byte(3)*0x10000+t:byte(4)*0x1000000 end function num_args(func) local dump = string.dump(func) local offset, cursor = int(dump:sub(13)), offset + 26 --Get the params and var flag (whether there's a ... in the param) return dump:sub(cursor):byte(), dump:sub(cursor+1):byte() end -- Usage: num_args(function(a,b,c,d, ...) end) -- return 4, 7 -- Python styled string format operator local gm = debug.getmetatable("") gm.__mod=function(self, other) if type(other) ~= "table" then other = {other} end for i,v in ipairs(other) do other[i] = tostring(v) end return self:format(unpack(other)) end print([===[ blah blah %s, (%d %d) ]===]%{"blah", num_args(int)}) --[=[-- table.maxn is deprecated, use # instead. --]=]-- print(table.maxn{1,2,[4]=4,[8]=8) -- outputs 8 instead of 2 print(5 --[[ blah ]])