This sounds very Kernel-like, e.g.
foo: func [block <environment> env] [
print mold block
print [env.x env.y]
]
bar: func [x] [
let y: 20
foo [x + y]
]
>> bar 10
[x + y]
10 20
It's true that specifiers have been creeping toward being able to offer something like this functionality. But they were originally made with a particular mix of correctness and optimization in mind for combining FRAME! instances with "relativized" function bodies, so that simple index numbers could be used to find instance variables. Extending them has been experimental to permit things like LET but they're fairly brittle at present.
Today's specifiers narrow the fiddling to literals. e.g. if foo [x + y] would have the specifier influence [x + y], but if you'd written if foo (block) the specifier wouldn't affect the passed-in block...so it's different from a situation where IF was receiving an environment.
I'm worried about a generalized <environment>
becoming available... and especially if such an out-of-band parameter sneaks in and affecting the behavior of fundamentals like COMPOSE or EITHER etc.
Once you have this out of band parameter, you have the problem of what happens when things get a step removed and you need to start making it passed in-band. (e.g. the difference between a function that calls COMPOSE directly vs. a function that calls a function that calls COMPOSE, where the intended environment of influence comes from the outermost call).
You also start getting some strange combinatorics of how much influence the environment is supposed to have in an operation vs. any existing binding on the passed in items. So I'd generally been going with the idea that the evolution of binding from being "just on words" to being "on words and arrays" would keep with the spirit that the way to tunnel "environments" through is to use mechanisms that put them granularly on your arguments vs. relying on this parameter.
For the vast majority of code, I like the idea that whatever is done with environments gets those environments pasted onto the values themselves, so that things like GET and COMPOSE remain single-arity in an abstractable way, so that they can also be abstracted as single-arity functions without introducing quandaries from sometimes-implicit environment parameters.