I start to want a Reader Monad stack for all the stuff I need to thread through all functions.
xBase, Clipper, Perl, Tcl upvars
For something like Zig, it would make sense to go one step further and require them to be declared to be passed, i.e. no "tunneling" through interleaving non-Io functions. But it could still automatically match them e.g. by types, so that any argument of type Io, if marked with some keyword to indicate explicit propagation, would be automatically passed to a call that requires one.
And I think we need something like this to get people off globals.