lua-users home
lua-l archive

Re: switch statement

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


On Mon, Dec 07, 1998 at 09:35:13PM -0200, David Jeske wrote:
> With a little trickery, you can make this even cooler...
> 
> Switch{
> [1] = function (x) B1 end,
> [2] = function (x) B2 end,
> ["nop"] = function (x) B3 end,
> ["my name"] = function (x) B4 end,
> ["__default__"] = function (x) B5 end
> }[x](arg);
> 
> Where the 'Switch' function sets the tag of the table so unknown
> accesses return the "__default__" element.
Or you could put the switchvar and arguments up at the top:
Switch(switch_var,{arg1, arg2}, {
 [1] = function (x) B1 end,
 [2] = function (x) B2 end,
 ["nop"] = function (x) B3 end,
 ["my name"] = function (x) B4 end,
 ["__default__"] = function (x) B5 end
});
function Switch(sw_var, args, swtbl)
 local val;
 val = swtbl[sw_var]
 if (not val) then
 val = swtbl["__default__"];
 if (not val) then
 lua_error(format("Missing case in switch ("..
 tostring(sw_var)..")"));
 end
 end
 if (type(val) ~= "function") then
 if (not args) then
 return val; -- passive switch
 else
 lua_error(format("Non function case in switch ("..
 tostring(sw_var)..")"));
 end
 end
 return call(val,args); -- I think this is the right syntax for call()
end
======
I have a question for the Lua implementors though. What are the
performance implications of putting this table initialization syntax
within a function call? What is the overhead of putting the above example in a function vs doing it like this:
switch_tbl = {
 [1] = function (x) B1 end,
 [2] = function (x) B2 end,
 ["nop"] = function (x) B3 end,
 ["my name"] = function (x) B4 end,
 ["__default__"] = function (x) B5 end
};
function a()
 Switch(switch_var,{arg1,arg2},switch_tbl);
end
-- 
David Jeske (N9LCA) + http://www.chat.net/~jeske/ + jeske@chat.net

AltStyle によって変換されたページ (->オリジナル) /