Первый прием связывает переменную V
с 1
, поэтому второй прием становится:
receive
1 -> ...
end
И, поскольку сообщение 1
никогда не приходит, время второго приема истекает. После истечения времени ожидания вы можете позвонить flush()
в оболочке, и вы увидите, что в почтовом ящике было сообщение 2
. Вы также можете вызвать b()
в любое время, чтобы отобразить текущие переменные и их значения (которые называются связываниями) - попробуйте это после выполнения первого приема.
В вашей функции вы также выполняете рекурсивное получение в пределах получения в получении, так что первое получение никогда не заканчивается. Чтобы доказать это, вы можете поместить оператор печати после:
Receiver(New)
, например:
io:format("receive ending with Current= ~w~n", [Current])
, и вы никогда не увидите вывод. Вы должны изменить свой прием на что-то вроде этого:
New = Currrent + 1
receive
Sender ->
io:format(" -- Sending ~p to ~p~n", [New, Sender]),
Sender ! New,
io:format("receive ending with Current= ~w~n", [Current])
end,
counter(New).