- ideal: use both, function calls and 0D (Send ()), without letting language influence your thinking - ideal: use both, but, remain aware of what each choice accomplishes - ideal: 0D to be so cheap that it could be used on every line of code - reality: 0D is entangled with Multiprocessing and the current grain size is "Process" - alternate reality: 0D can be couched in terms of closures and FIFOs, hence, grain size is "function" (where closure is roughly equivalent to function) - reality: CALL/RETURN and the callstack are hard-wired into CPUs (there used to be a time when CPUs didn't have hard-wired callstacks) - reality: 1950s IDEs for Programming were Programming Languages, but, in 2022++ IDEs include other stuff, like powerful programming editors CALL is used for 2 reasons: (1) compacting code size, (2) DRY (Don't Repeat Yourself). There is no good reason to allow CALL/RETURN to leak into end-user code except for case (1) compacting code size [corollary: case (2) should be entirely optimized away at "compile time" and "edit time"] x.f(x) is syntax with the meaning "mutate the global callstack and mutate the IP to point at the method function x.f" (and "return" means "put the return value in a special place, then mutate the global callstack, then mutate the IP to point at the caller's continuation code") but, there is no popular builtin syntax for Send()ing to an output queue and passing the finalized output queue back up to the parent Container