[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Multiple returns & list constructors
- From: Asko Kauppi <asko.kauppi@...>
- Date: Wed, 18 Aug 2004 18:37:37 +0300
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...