lua-users home
lua-l archive

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


Could the table.n problem be discussed and resolved at the Harvard meeting
please? I believe this is an issue to do with the standard libraries.


list = { "a","b","c" }
tinsert(list,"d")

-- 1.
for _,v in list do print(v) end

-- 2.
foreach(list, function(i,v) print(v) end)

-- 3.
for i = 1,getn(list) do
  local v=list[i]
  print(v)
end

-- 4.
foreachi(list, function(i,v) print(v) end)

When printing the list, the first 2 solutions include n. The latter, more
bulky 2, do not. I would like Lua to not add n to a table out of the box. I
found the for statement a very useful addition to Lua. It is a real pain
having use the later 2 solutions when I want to iterate over a list, or I
have to override tinsert(),tremove() and getn().

The best solution I have encountered so far is using weak keyed tables to
hold n for each table and the addition of setn(). I would like to see a
solution like :-

_tn = {}

function getn (t)
         -- if type(t.n) == "number" then return t.n end
         if _tn[t] then return _tn[t] end
         local max = 0
         for i, _ in t do
           if type(i) == "number" and i>max then max=i end
         end
         return max
       end

function setn(t,n) _tn[t] = n end

       function tinsert (t, ...)
         local pos, value
         local n = getn(t)
         if arg.n == 1 then
           pos, value = n+1, arg[1]
         else
           pos, value = arg[1], arg[2]
         end
         -- t.n = n+1;
         setn(t,n+1)
         for i=n,pos,-1 do
           t[i+1] = t[i]
         end
         t[pos] = value
       end



       function tremove (t, pos)
         local n = getn(t)
         if n<=0 then return end
         pos = pos or n
         local value = t[pos]
         for i=pos,n-1 do
           t[i] = t[i+1]
         end
         t[n] = nil
         -- t.n = n-1
         setn(t,n-1)
         return value
       end

Its not just a pain because the iteration problem, but also because it can
cause conflicts...
http://lua-users.org/wiki/LuaTableSize

Regards,
Nick