lua-users home
lua-l archive

Re: Multiple returns & list constructors

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


I've done it in Hamster (the Lua-based build tool) using tables. So each entry can be a number, string, or table (recursively). Only the _last_ user (the one actually reading the table) needs to 'unwrap' it, for which purpose I use:
-----
-- tbl= Loc_TableFlatten( val [,force_copy_bool] )
--
-- Returns a table without subtables (flattens contents into the main table).
-- Also removes any 'nil' or 'false' items.
--
-- Params: 'force_copy' may be used for ensuring the returned table is always -- a local copy of the provided one (even if they were identical). -- This is useful if the caller wants to later modify the contents.
--
-- Note: Tables are expected to be just containers (index values don't matter) -- but order is maintained (important for 'append' and 'prepend' functions).
--
local function Loc_TableFlatten( val, force_copy )
 --
 if not val then return nil; end
 if type(val) ~= "table" then -- make scalars into a table
 return {val}
 end
 -- If already flat, skip making another table (optimization)
 --
 if not force_copy then
 if Loc_IsFlatTableWithoutNils(val) and (not val.n) then
 return val
 end
 end
 -- Find out largest index (note: there may be holes in the table!)
 --
 local ret= {}
 for i=1,getn(val) do -- jump over holes
 --
 local v= val[i]
 if not v then -- skip 'nil's and 'false's
 --
 elseif type(v)=="table" then
for _,v2 in ipairs( Loc_TableFlatten(v,force_copy) ) do -- keep order!
 table.insert( ret, v2 )
 end
 else
 table.insert( ret, v )
 end
 end
 return ret
end
ASSUME( _table.getn( Loc_TableFlatten( { 1,2,{3,4;n=2},5} ) ) == 5 )
ASSUME( _table.getn( Loc_TableFlatten( { 'a','b',[4]='c' } ) ) == 3 )
18.8.2004 kello 15:01, David Given kirjoitti:
Are there any workarounds I can use to fix this? I can have fn() return a table, in which case the table gets added to the list, but it's still added as a single item where I actually want the contents of the item instead...

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