view 5-Erlang/infinirun.erl @ 103:98be775c533c default tip

An odd "non-determinism" example from StackOverflow It is clever, but doesn't make much sense as to how it gets its results
author IBBoard <dev@ibboard.co.uk>
date Sun, 14 Jul 2019 13:44:13 +0100
parents 7bab4843aec6
children
line wrap: on
line source

-module(infinirun).
-export([loop/0]).

% To run, call: Restarter = spawn(fun infinirun:loop/0).
% Then call Restarter ! new to initiate
% This does black magic and registers a public atom called "revolver", which is a process running roulette:loop/0 that can receive messages
loop() ->
    % Indicate that we want exist signals, which are a 3-tuple of { 'EXIT', From, Reason }
    process_flag(trap_exit, true),
    receive
        new ->
            % Start a new process
            io:format("Creating and monitoring process.~n"),
            register(revolver, spawn_link(fun roulette:loop/0)),
            loop();
        {'EXIT', From, Reason} ->
            io:format("The shooter ~p died with reason ~p. Restarting…~n", [From, Reason]),
            % Send ourselves a message to register a new process
            self() ! new,
            loop()
end.