[erlang-questions] Idiomatic Erlang, style/performance question

Lev Walkin <>
Fri Jun 20 10:35:25 CEST 2008


Dominic Williams wrote:
> Hello,
> 
> ROK wrote:
>> I prefer the term "Tail-Call Optimisation" because it is more accurate.
>> The idea (as explained in "Lambda - the Ultimate Goto") is that if the
>> dynamically last thing a function does (in any language) is to return
>> the result of another function call, then there is no point in keeping
>> the current stack frame.  You might as well arrange for the new
>> function to return directly to the original caller.  Think of *all*
>> tail calls as "argument binding + GOTO".
> 
> Is the optimisation possible even when the tail call is not to the same
> function?

Yes.

> E.g.:
> 
>>> power(N, P) when is_integer(P), P >= 0 ->
>>>         ipower(N, P, 1);
>>>     power(N, P) when is_integer(P), P < 0 ->
>>>         1/ipower(N, -P, 1).
>> The first call here is a tail call, the second is not.
> 
> As I wrote in a previous post, I thought that there was no optimisation
> here, because it is not a /recursive/ tail-call. Am I wrong? What is the
> case for Erlang, in particular?

Erlang optimizes tail calls, not necessarily recursive ones.


-- 
Lev Walkin




More information about the erlang-questions mailing list