large gen_fsms

Richard Cameron <>
Mon Mar 20 22:10:48 CET 2006


On 20 Mar 2006, at 19:59, Alex Arnon wrote:

> state1() ->
>         receive
>                 go_to_state_2 -> state2();
>                 _ -> state1()
>         end.
>
> state2() ->
>         receive
>                 go_to_state_1 -> state1();
>                 go_to_state_3 -> state2()
>         end.
>
> ...
>
> Wouldn't this cause the stack to bloat indefinitely? Or does tail- 
> calling eliminate this in Erlang?

  No. Erlang has "last call optimisation" (of which tail recursion is  
a specific case). The code above will execute in constant space.

You'll sometimes also notice last call optimisation when you're  
debugging Erlang code. For instance:

---

-module(x).

-compile(export_all).

f() ->
	g().

g() ->
	math:sqrt(-1).

---

g() will generate a runtime 'badarith' expression. If you call f()  
from the shell and look carefully at the stack trace you'll notice  
something odd - there's no mention of the call to f() anywhere. It  
simply disappeared when it made an LCO call to g():


  1> x:f().

=ERROR REPORT==== 20-Mar-2006::21:09:21 ===
Error in process <0.64.0> with exit value: {badarith,[{math,sqrt, 
[-1]},{x,g,0},{erl_eval,do_apply,5},{shell,exprs,6},{shell,eval_loop, 
3}]}

** exited: {badarith,[{math,sqrt,[-1]},
                       {x,g,0},
                       {erl_eval,do_apply,5},
                       {shell,exprs,6},
                       {shell,eval_loop,3}]} **




More information about the erlang-questions mailing list