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.

So, my question is, how can 'wait' work while *Run is not set to any value?

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.

Thank you for your time.

Reply via email to