lua-users home
lua-l archive

[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