Still a lot of questions to be answered, but it really is night and day from the historical binding model.
One question to answer with ? though is what to do about it when the concept of "what to call to propagate" isn't named RETURN.
Though as it so happens, generators aren't allowed to YIELD a raised error. There is only one raised error contractually that arises from a generator, and that's the generation termination error. This way if you intercept a raised error from a generator you can assume the reason why and act on it. All other raised errors will be promoted to abrupt failure before the YIELD can give them back.
But maybe you have a CATCH/THROW situation and you want the throw to be what you use.
The just-a-thought-for-now concept of dialecting function calls might have some options here. What about ?:throw
result: catch [
?:throw some expression
?:throw some other expression
print "Then you get here"
throw <success>
] except e -> [
print ["You failed!" mold e]
]
So it could presume RETURN if you don't say otherwise, yet still be used for other things.
The dialected function call concept has been simmering a bit, and I do keep finding places where I think it would be nice.
Prior to that being decided, there could still be a convention to name your own variants, e.g. ?-THROW
result: catch [
?-throw some expression
?-throw some other expression
print "Then you get here"
throw <success>
] except e -> [
print ["You failed!" mold e]
]
And you could define it within a context if you planned to use it a lot:
result: catch [
let ?: ?-throw/
? some expression
? some other expression
print "Then you get here"
throw <success>
] except e -> [
print ["You failed!" mold e]
]