lua-users home
lua-l archive

Lua tuples. was Re: Lua Tutor? Porting Python code to Lua.

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


Don't do tomorrow what you can do today. Here is
my short, incomplete, but iuuseful tuple library written 
for LUA 5 alpha. It's freely usable for all. Comments and 
improvements are welcome. Maybe someone could
upload it at the wiki as well? 
Oh, and I hope the "__eq" metamethod will remain supported.
It's much easier to do equality when you have that.
-- begin lua.ntuple 
--
-- ntuple.lua Generic n-tuple support in LUA 5 alpha.
-- Written by Bjorn De Meyer, 2002. 
-- I hereby release this source coude to the public domain.
-- Comments welcome.
tuple = {};
tuple.COMPARE_SHORTER = -2
tuple.COMPARE_SMALLER = -1
tuple.COMPARE_EQUAL = 0
tuple.COMPARE_BIGGER = 1
tuple.COMPARE_LONGER = 2
-- zero means equal, positive means t1 is bigger,
-- negative means t1 is smaller
function tuple.compare(t1,t2)
 local n1, n2, index;
 n1 = table.getn(t1);
 n2 = table.getn(t2);
 if (n1>n2) then return tuple.COMPARE_LONGER;
 elseif (n1<n2) then return tuple.COMPARE_SHORTER; 
 end
 for index =1, n1 do
 if(t1[index] > t2[index]) then return tuple.COMPARE_BIGGER 
 elseif(t1[index] < t2[index]) then return tuple.COMPARE_SMALLER
 end 
 end
 return tuple.COMPARE_EQUAL; 
end
-- a "walk" function.
-- handy for printing and such...
function tuple:walk(f, ...)
local index; 
 for index = 1, table.getn(self) do
 f(self[index], unpack(arg))
 end 
end
tuple.meta = { } ; -- new metatable, but empty, for now.
-- set up a table to be a tuple
function tuple.maketuple(t)
 t.walk = tuple.walk 
 -- copy some methods.
 setmetatable(t, tuple.meta)
 -- set correct metatable.
 return t
end
-- Arihmetic. Does not do any checking.
function tuple.add(t1, t2)
 local result = {}; 
 print(t1, t2)
 for index = 1, table.getn(t1) do
 result[index] = t1[index] + t2[index]
 end
 return(tuple.maketuple(result)) 
end
function tuple.sub(t1, t2)
 local result = {}; 
 for index = 1,table.getn(t1) do
 result[index] = t1[index] - t2[index]
 end
 return(tuple.maketuple(result)) 
end
function tuple.mul(t1, t2)
 local result = {}; 
 for index = 1,table.getn(t1) do
 result[index] = t1[index] * t2[index]
 end
 return(tuple.maketuple(result)) 
end
function tuple.div(t1, t2)
 local result = {}; 
 for index = 1,table.getn(t1) do
 result[index] = t1[index] / t2[index]
 end
 return(tuple.maketuple(result)) 
end
function tuple.pow(t1, t2)
 local result = {}; 
 for index = 1,table.getn(t1) do
 result[index] = t1[index] ^ t2[index]
 end
 return(tuple.maketuple(result)) 
end
function tuple.unm(t1, t2)
 local result = {}; 
 for index = 1,table.getn(t1) do
 result[index] = - t1[index];
 end
 return(tuple.maketuple(result)) 
end
-- Comparison
function tuple.lt(t1, t2)
 local result; 
 return tuple.compare(t1,t2) < tuple.COMPARE_EQUAL;
end
function tuple.le(t1, t2)
 local result; 
 return tuple.compare(t1,t2) < tuple.COMPARE_BIGGER;
end
function tuple.eq(t1, t2)
 local result; 
 return tuple.compare(t1,t2) == tuple.COMPARE_EQUAL;
end
-- Construction
function tuple.new(...) 
local result, k, v, index;
 index = 0; result = {};
 for k, v in ipairs(arg) do
 index = index + 1
 rawset(result,index,v); 
 -- store values of the arguments in a table, indexed as array
 end
 table.setn(result, index)
 tuple.maketuple(result)
 return result;
end
-- Type checking.
function tuple.istuple(t)
 return getmetatable(t) == tuple.meta;
end
tuple.meta.__add = tuple.add;
tuple.meta.__mul = tuple.mul;
tuple.meta.__div = tuple.div;
tuple.meta.__sub = tuple.sub;
tuple.meta.__pow = tuple.pow;
tuple.meta.__unm = tuple.unm;
tuple.meta.__lt = tuple.lt;
tuple.meta.__eq = tuple.eq;
-- set up metamethods. 
-- finally, make a shortcut 
NTUPLE = tuple.new;
-- Cut here, the rest are examples. 
tt= NTUPLE(1, 2 ,5);
t2= NTUPLE(7, 5 ,2);
t3 = NTUPLE(1 ,2, 5)
res = tt ^ t2
res2 = -tt;
res:walk(io.write,",");
res2:walk(io.write,",");
print("");
print(tuple.istuple(res));
print(tt == t3);
-- 
"No one knows true heroes, for they speak not of their greatness." -- 
Daniel Remar.
Björn De Meyer 
bjorn.demeyer@pandora.be

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