[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: Proper tail recursion
- From: ramsdell@... (John D. Ramsdell)
- Date: 30 Jul 2001 07:35:41 -0400
For this note, assume that a word surrounded by the underline
character means the word should be typeset in italics.
Roberto Ierusalimschy <firstname.lastname@example.org> writes:
> Again, it is easy for the interpreter to test whether the called function
> is C or Lua, and act accordingly. The real problems I see for tail calls in
> Lua are
> 1 - debugging. Many Lua users do not even know what is a tail call, and
> expect to see them in a stack trace.
> 2 - subtle behaviour. "return f()" is a proper tail call (*if* f is a Lua
> function), but "return x, f()" and "f(); return" are not. This can be
> quite confusing for programmers assuming proper tail calls.
The subtle behavior you point out suggests to me a simple rule for the
identification of tail calls. The rule is easy for programmers to
understand. The rule could be:
A call is a tail call if and only if it occurs in a statement of the
form "return _tailcall_", _tailcall_ is a Lua function call
expression _functioncall_, and the function part of the function
call evaluates to a Lua function. The syntactic category
_functioncall_ is defined in the section of the manual titled "The
complete Syntax of Lua".
In other words, only statements of the form:
return _varorfunct_ [ ':' _name_ ] _args_
are tail calls, and only when
_varorfunct_ [ ':' _name_ ]
evaluates to a Lua function.