lua-users home
lua-l archive

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


Hey list,
 
I was going through archives and read this now ancient post by Diego Nehab:
 
http://lua-users.org/lists/lua-l/2006-04/msg00109.html
 
I know bumping old posts is very (extremely?) bad form, but with talk about Lua 6 thought I might resurrect the idea anyway and see if interest has changed. Let this post die a natural death if sentiment hasn't changed :). The idea is easy enough to implement, and with a small optimization (to recognise vararg appends / vararg pops) some functions that are currently impossible to write in O(n) time Lua become possible. The vm would require a second value stack for arguments, but that's possibly a better solution then the current varargs-between-call-frames anyway imo. Simplifies callinfos somewhat, removing the need for a func stkid.
 
Here's a couple of ways to abuse the idea which I quite like :)
 
(P.S. I did a quick look for lua wish list via google so as to not annoy the list, but only found a page which discourages syntax changes... are there any generic wish list pages?)
 
Current Lua:
-- O(n^2) algorithm
function sumargs(...)
  local res = 0
  for i = 1, select("#", ...) do
    res = res + select(i, ...)
  end
  return res
end
 
With ... as lvalue:
-- O(n) algorithm
function sumargs(...)
  local res = 0
  while ... do
    local x, ... = ...
    res = res + x
  end
  return res
end
 
 
Current Lua:
function dostuff()
  local res1, res2, res3
  lock()
  if cond() then
    res1, res2 = get2res()
  else
    res1, res2, res3 = get3res()
  end
  unlock()
  return res1, res2, res3
end
 
With ... as an lvalue:
function dostuff()
  lock()
  if cond() then
    ... = get2res()
  else
    ... = get3res()
  end
  unlock()
  return ...
end
 
 
Current Lua:
-- O(n^2) algorithm - only way to rewrite unpack in lua
-- (could be made O(n) time by having the compiler recognise append return tailcalls)
--
-- Coincidentally, deep recursive calls can be improved by this line change in lvm.c:
--   if (L->openupval) luaF_close(L, base);
-- to
--   if (L->openupval && cl->p->p) luaF_close(L, base);
-- As at any time there's often an open closure, but rarely is the creator the running function
function auxunpack(tab, start, len)
  if start <= len then
    return tab[start], unpack(tab, start+1, len)
  end
end
function unpack(tab, start, len)
  return auxunpack(tab, start or 1, len or #tab)
end
 
With ... as lvalue:
-- O(n) algorithm
-- to expand ... requires writing result backwards
function unpack(tab, start, len)
  for i = len or #tab, start or 1, -1 do
    ... = tab[i], ...
  end
  return ...
end
 
- Alex