erlang如何处理与尾递归混合的case语句

Med*_*her 13 erlang recursion case tail

假设我在这里有这个代码:

do_recv_loop(State) ->
    receive
    {do,Stuff} ->
        case Stuff of
        one_thing -> 
            do_one_thing(),
            do_recv_loop(State);
        another_thing ->
            do_another_thing(),
            do_recv_loop(State);
        _ ->
            im_dead_now
        end
    {die} -> im_dead_now;
    _ -> do_recv_loop(State)
    end.
Run Code Online (Sandbox Code Playgroud)

现在,理论上这是尾递归的,因为对do_recv_loop的三次调用都不需要返回任何内容.但是,erlang会认识到这是尾递归并适当优化吗?我担心嵌套结构可能使它无法识别它.

nmi*_*els 16

是的,它会的.Erlang需要优化尾调用,这显然是尾调用,因为调用函数后没有任何反应.

我曾经希望tailcall在Erlang中有一个关键字,所以编译器可以警告我无效使用,但后来我习惯了.