JanWielemaker / swi-erlang

Yes, Erlang in SWI-Prolog!
12 stars 1 forks source link

Isolation too strong #6

Open torbjornlager opened 6 years ago

torbjornlager commented 6 years ago

Isolation is too strong. One would expect the following program (a rewrite of ring.pl) to work, but it doesn't. It would work if the definition of loop/1 was passed (using the src_text option) to the spawn that calls loop/1, but we don't want to do that.

:- use_module(actors).

s(N, Msg) :-
    spawn(start(N, Msg), _Pid, [
        src_text("

            start(NumberProcesses, Message) :-
                get_time(Start),
                self(Self),
                create(NumberProcesses, Self, Message),
                receive({ Msg ->
                          get_time(End),
                          Wall is End - Start,
                          writeln(Msg-Wall) }).

            create(1, NextProcess, Message) :- !,
                NextProcess ! Message.
            create(NumberProcesses, NextProcess, Message) :-
                spawn(loop(NextProcess), Prev,
                      [ link(true)
                      ]),
                NumberProcesses1 is NumberProcesses - 1,
                create(NumberProcesses1, Prev, Message).

            loop(NextProcess) :-
                receive({
                    Msg ->
                        NextProcess ! Msg
                }).
        ")
    ]).
torbjornlager commented 6 years ago

Let's put this one on hold. I'll get back to it...