[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Stack level doesn't match hook events
- From: Rici Lake <lua@...>
- Date: Sat, 18 Sep 2004 01:21:51 -0500
On 17-Sep-04, at 7:54 PM, Tom Spilman wrote:
return the_page_stack:restore_device_objects()
This is a tail call; it is effectively optimised into a jump.
So the caller of the_page_stack:restore_device_objects() has
been removed from the stack before the function is called.
Tail calls make it simple to implement state machines, for example;
each state "recursively" tail calls its choice of the next state, but
this works with a constant stack
Or you can write recursive functions that run in a constant stack, such 
as:
  local function fib(i, r1, r2)
    if i <= 1 then return r1
              else return fib(i - 1, r1 + r2, r1)
    end
  end
  function fibonacci(i) return fib(i, 1, 0) end
Lua's attempts to "simulate" non-tail-call semantics by providing
fake stack slots actually make it harder to debug that sort of code.
But tastes vary.
As a possibly interesting side-note, I've done some experimentation
with this particular definition of fibonacci on gcc on various 
platforms,
and it turns out that not only does gcc (in recent versions) also 
convert
recursive call into a tail-call, on some platforms it generates faster 
code
than the more classic iterative expression. (Interestingly, the 
optimiser
generates the first eight or so results as a static lookup for the 
recursive
function but not for the iterative function; I'm assuming that this is
because the lack of assignment statements makes flow analysis easier.)