Thanks Joh! ... the explanation was very helpful! Regards, Kashyap On Sun, May 12, 2019 at 3:23 PM Joh-Tob Schäg <johtob...@gmail.com> wrote:
> The docs: > (later 'var . prg) -> varExecutes prg in a pipe'ed child process. The > return value of prg will later be available in var. Note that later > uses pr and rd to communicate the result, so prg should not write any > data to standard output as a side effect. > > : (prog1 # Parallel background calculation of square numbers > (mapcan '((N) (later (cons) (* N N))) (1 2 3 4)) > (wait NIL (full @)) ) > -> (1 4 9 16) > > It might help that this code the same. > : (prog1 # Parallel background calculation of square numbers > (mapcan '((N) (later (list) (* N N))) (1 2 3 4)) > (wait NIL (full @)) ) > -> (1 4 9 16) > > Or more departmentalized: > (setq B (list )) > -> (NIL) > ('((N) (later B (prog1 (* N N) (wait 8000)))) 1) > -> (NIL) > B > -> (NIL) > (wait 8000) > .. > B > -> (1) > > Later needs a store to place things. This code uses the following non > obvious fact: > > (setq D (list)) > -> (NIL) > (setq `D 8) > -> 8 > D > -> (8) > > or in a more general case: > (setq U (range 1 20)) > (set (nth U 8) 0) > U > -> (1 2 3 4 5 6 7 0 9 10 11 12 13 14 15 16 17 18 19 20) > > What happens step by step: > 1.0 prog1 evaluates (mapcan '((N) (later (list) (* N N))) (1 2 3 4)) > and stores the resulting expression > 1.1 mapcan calls '((N) (later (list) (* N N))) with 1 through 4. > 1.1.1 Each call of this lamda creates a new cell (lets call it temp) > by calling (list) or (cons) > 1.1.2 temp is set to be the place where return value of the inner > expression which is calculated by another process is stored by later > 1.1.3 the temp cell is returned with the result of the calculation still > pending > 1.2 mapcan takes these cells and links them destuctively in to one list > 1.3 mapcan returns that list and the result it written in to @. > > 2.0 prog1 evaluates (wait NIL (full @)) ) where @ refers to the return > value of the previous expression at this level of evaluation. > 3.0 prog1 returns the value it stores. The value being the value that > was also refered by @ > > What is @? > @ is the list of cells where (in which car) other process will put > their values into. > > Why wait for the full list? This might get really ugly if the list > becomes partially garbage and is written to. I am not sure this > behaves since this is internal to the interpreter and "undefined > behavior" > > > > On Sun, 12 May 2019 at 22:06, C K Kashyap <ckkash...@gmail.com> wrote: > > > > Hi Alex, > > Could you please explain the role of (cons) as the first parameter to > later? If I understand correctly, that does not seem to have a role in the > the final list return values from the child processes. > > Regards, > > Kashyap > > > > On Sun, May 12, 2019 at 7:17 AM C K Kashyap <ckkash...@gmail.com> wrote: > >> > >> Yup ... that's the first edit I tried :) > >> Regards, > >> Kashyap > >> > >> On Sun, May 12, 2019 at 12:34 AM Alexander Burger <a...@software-lab.de> > wrote: > >>> > >>> On Sat, May 11, 2019 at 10:09:27PM +0200, Alexander Burger wrote: > >>> > (let Lst > >>> > (mapcan > >>> > '((File) > >>> > (later (cons) > >>> > (... download File ...) > >>> > T ) ) > >>> > ... > >>> > >>> Note that instead of 'T' you may also return any non-NIL value, e.g the > >>> downloaded size, or a list with statistical values. > >>> > >>> / A!ex > >>> > >>> -- > >>> UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe > > -- > UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe >