2012-01-19 14 views
1

以下はerlangで実行でき、メモリヒープの問題によりクラッシュを生成できませんか?Erlang受信と適切な呼び出し構造

loop() -> 
    receive 
     {drop, X} -> drop(X); 
     X -> handle(X) 
    end. 

handle(X) -> 
    case X of 
    ok -> loop() 
    end. 

drop(X) -> 
    case X of 
    ok -> loop() 
    end. 

答えて

6

それは試してみて、何が起こるか見ることは簡単です:

-module(loop). 
-compile(export_all). 
loop() -> 
    receive 
     {drop, X} -> drop(X); 
    after 1000 -> 
     erlang:display(catch erlang:error(noes)), 
     drop(ok) 
    end. 

drop(X) -> 
    case X of 
    ok -> loop() 
    end. 

あなたがループを実行した場合:ループを()あなたはそれがInfactはスタックを成長しないことがわかります。を追加すると、drop(ok)またはloop()の呼び出しの後に1が表示されます。

したがって、コンパイラは、それが再帰的テールコールではないにもかかわらず、テールコールであり、最適化していることを認識します。

+0

はい、コンパイラはこのように** all ** tail-callsを処理します。 – rvirding

1

書き込まれた関数はテール再帰的ではないため、私の勘ぐとは思いません。

関連する問題