pingpong example

This commit is contained in:
Peter Harpending 2025-09-23 15:18:12 -07:00
parent 91c6e62cbb
commit 28193491e7

51
etc/pingpong.erl Normal file
View File

@ -0,0 +1,51 @@
-module(pingpong).
-export([main/0]).
% this runs two processes and has them talk to each other
% output:
%
% 2> pingpong:main().
% <0.96.0> received {pong, <0.97.0>, 10}
% <0.97.0> received {ping, <0.96.0>, 9}
% <0.96.0> received {pong, <0.97.0>, 8}
% <0.97.0> received {ping, <0.96.0>, 7}
% <0.96.0> received {pong, <0.97.0>, 6}
% <0.97.0> received {ping, <0.96.0>, 5}
% <0.96.0> received {pong, <0.97.0>, 4}
% <0.97.0> received {ping, <0.96.0>, 3}
% <0.96.0> received {pong, <0.97.0>, 2}
% <0.97.0> received {ping, <0.96.0>, 1}
% <0.96.0> received {pong, <0.97.0>, 0}
main() ->
PingerPID = spawn(fun pinger/0),
PongerPID = spawn(fun ponger/0),
PingerPID ! {pong, PongerPID, 10}.
pinger() ->
receive
{pong, PID, N} ->
io:format("~p received {pong, ~p, ~p}~n", [self(), PID, N]),
% ignore once we get to 0 or lower
case N > 0 of
true -> PID ! {ping, self(), N-1};
false -> ok
end,
% once we're done, go back to the top
pinger()
end.
ponger() ->
receive
{ping, PID, N} ->
io:format("~p received {ping, ~p, ~p}~n", [self(), PID, N]),
% ignore once we get to 0 or lower
case N > 0 of
true -> PID ! {pong, self(), N-1};
false -> ok
end,
% once we're done, go back to the top
ponger()
end.