Worth noting is there's an issue in the Red repository for this as well:
Says @hiiamboris:
"Maybe crazy: bind every
return&exitthe same way we do bind function arguments/locals, so that they know their scope from the context they are bound to. But then if we writecode: [return 1] f: does [do code]it won't work. Trading one limitation for another, plus likely more complexity in interpreter code. And we can't bindbreak/continueas there is no context for loops..."
"That’s not extremism; that’s epistemic hygiene."
I'll point out that in Ren-C you don't trade one limitation for another, because binding propagates from tips of lists downward in evaluation, giving unbound material meaning as it descends. So unless you explicitly bound a RETURN word in a block, it will get its meaning from context, even if definitional.
I think that making return of trash as simple as return ~ avoids needing a separate EXIT definition. Also, it's nice to retake the word EXIT for other things.
And of course, Ren-C has definitional BREAK and CONTINUE (as well as definitional THROW, where you can also pass CATCH the word to use as its "throw")
So not crazy at all, if you have the right binding ideas.
"plus likely more complexity in interpreter code."
Simple but broken is not actually simple. It's just...broken.
"everything should be made as simple as possible, but no simpler"