Erlang: dica rápida, spawn e self

Pode parecer um erro idiota (e talvez seja mesmo), mas acredito ser bem comum, especialmente quando você está começando com Erlang: chamar self/0 logo depois do spawn, pensando que está referindo-se ao processo pai.

Exemplo:

funcao_pai() -ᐳ    faz_algo(),
    spawn(
        fun() -ᐳ
            funcao_filha(self())
        end
    ).

É fácil de você se confundir e começar a pensar no processo novo a partir da execução de funcao_filha/1, isto é, a partir da entrada em seu escopo. Engano! O escopo do novo processo é a fun/0 que foi chamada pela spawn/1.

Consequentemente, aquela chamada a self/0 não retorna o PID do processo pai (execução em funcao_pai/0), mas o PID do processo filho (execução já na fun/0).

Quando você está no meio de um “ímpeto programadorístico”, essa coisa óbvia pode passar desapercebida. Fica a dica. :)


Este artigo foi escrito originalmente em 14/12/2014.