local p = local data1 = local e2id
function eToId(e) return e end
function p.element(frame) local args = frame.args -- arguments in #invoke local first = args[1] or 'no value for first' -- first unnamed argument local dummy = args['dummy'] or 'no value for dummy' local eId = eToId(e) local e = -- Make a copy of the args table. The values will actually be present in -- argsCopy, so the # operator will work on it. The # operator doesn't work -- on the args table directly, because it doesn't actually contain any -- values. (The values are found through the use of metatables.) local argsCopy = for k, v in pairs(args) do argsCopy[k] = v end table.insert(e, ) return '*Value of #args (I don\'t think this does anything useful): ' .. #args .. '\n*Value of #argsCopy: ' .. #argsCopy .. '\n*First unnamed argument: ' .. first .. '\n*Dummy argument: ' .. dummyend
function p.metatable -- This function shows how metatables work with the # operator. -- The arguments table (frame.args) uses something similar to this, so -- this example should explain why # doesn't work on it. local ret =
-- At first, t1 is just a blank table. local t1 = ret = ret .. 't1 with no metatable:' ret = ret .. '\n* First unnamed argument: ' .. (t1[1] or 'no value for first') ret = ret .. '\n* Length: ' .. #t1 -- t2 contains the actual values we want. local t2 = ret = ret .. '\n\n' ret = ret .. 't2, which holds the arguments:' ret = ret .. '\n* First unnamed argument: ' .. (t2[1] or 'no value for first') ret = ret .. '\n* Length: ' .. #t2 -- Now we attatch a metatable to t1. We haven't given any instructions to -- the metatable yet, so it won't do anything for now. local metatable = setmetatable(t1, metatable) ret = ret .. '\n\n' ret = ret .. 't1 with a blank metatable:' ret = ret .. '\n* First unnamed argument: ' .. (t1[1] or 'no value for first') ret = ret .. '\n* Length: ' .. #t1 -- And now we add an __index metamethod to the metatable. This example -- tells Lua to look up values in t2 if the value in t1 is nil. -- t1 still doesn't contain any actual values, so its length is still -- reported as 0. metatable.__index = t2 ret = ret .. '\n\n' ret = ret .. 't1 with an __index metamethod set to t2:' ret = ret .. '\n* First unnamed argument: ' .. (t1[1] or 'no value for first') ret = ret .. '\n* Length: ' .. #t1
-- Now we write a new value to t1. This value is actually present in t1, so -- Lua doesn't look up the value in t2, and it is picked up by the # -- operator. t1[1] = 'A new first value for t1' ret = ret .. '\n\n' ret = ret .. 't1 with an __index metamethod set to t2, and a value written to the first field:' ret = ret .. '\n* First unnamed argument: ' .. (t1[1] or 'no value for first') ret = ret .. '\n* Length: ' .. #t1 return retend
return p