Hi Bruno,

> Joh-Tob's question got me curious about parallel code in picolisp. I've
> studied the example of 'later' in the documentation and I have an idea of
> how it works, but I don't understand how 'wait' works inside of it.
> I understand *what* it does, it makes sure that the child processes finish
> before returning the value for the whole expression.


> But I don't understand
> *how* it works because, in the form of 'wait' that is used, *Run should be
> executed each time the prg returns false. Yet *Run is not set to any value
> in the code.

In fact, *Run' is set, because 'later' installs a 'task' listening at the pipe
to the child process:

      (task (pipe (pr (prog . "@Prg")))

> Here's the code for reference:
> : (prog1
>     (mapcan '((N) (later (cons) (* N N))) (1 2 3 4))
>     (wait NIL (full @)) )
> -> (1 4 9 16)
> I would also appreciate if someone could check if my idea of what is going
> on in the code is correct:
> First, mapcan is executed. For each element in (1 2 3 4) a child process is
> started, and the result of each operation is stored in a cons pair: '(NIL).
> Every cons pair is concatenated into a list, which looks like '(NIL NIL NIL
> NIL) in this case. Note that the list is built *before* any of the child
> processes is completed, and since concatenation is destructive the result
> will be stored in the appropriate position in this list whenever the child
> process is finished. (wait NIL (full @)) checks that all these processes
> are done before ending the prog1.

Yes, this is absolutely correct.

♪♫ Alex
UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe

Reply via email to