
Hey list,
I was going through archives and read this now
ancient post by Diego Nehab:
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
varargsbetweencallframes 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 