Переменные связываются один раз в Erlang

Редактировать: я изменил название этого вопроса, так как это было бесполезно в свете сделанной мной ошибки n00b. Остальное не изменилось и служит предостережением!

Я использую Erlang OTP версии 17.4. Рассмотрим следующий сеанс оболочки Erlang, в котором я экспериментирую с флагом процесса trap_exit, как описано в "Learn You Some Erlang:Errors и процессы".

Во-первых, я установил флаг trap_exit, чтобы преобразовать сигналы выхода в связанных процессах в обычные сообщения:

Eshell V6.2  (abort with ^G)
1> process_flag(trap_exit, true).
false

Затем я создаю связанный процесс и немедленно завершаю его вызовом exit/2:

2> exit(spawn_link(fun() -> timer:sleep(50000) end), kill).
true

Затем я прочитал преобразованное выходное сообщение:

3> receive X -> X end.
{'EXIT',<0.61.0>,killed}

Пока все выглядит хорошо, как описано в книге. Теперь, просто для удовольствия, я spawn_link завершаю другой процесс:

4> exit(spawn_link(fun() -> timer:sleep(5000) end), kill).
true

И попробуйте прочитать преобразованное выходное сообщение:

5> receive X -> X end.

В этот момент оболочка зависает. Мой вопрос в том, почему поведение меняется при втором обходе и куда делось сообщение о выходе?


person James World    schedule 30.12.2014    source источник
comment
В оболочке вы можете распечатать полученные сообщения, используя flush().   -  person Pascal    schedule 30.12.2014


Ответы (1)


Ваш второй receive X -> X end. уже связан с X; он пытается получить сообщение, точно соответствующее тому, которое вы уже видели. Поскольку pid будет другим, сообщение никогда не будет совпадать. Так что он висит, ожидая того, который действительно соответствует.

Сначала вам нужно f(X).

person Roger Lipscombe    schedule 30.12.2014
comment
Спасибо и Дох!. Там ярко сияет мой статус n00b. :) - person James World; 30.12.2014