The following is the behavior of Rebol2 when a GET-WORD! is used on an "UNSET!" value:
rebol2>> unset 'x rebol2>> type? :x ** Script Error: x has no value
So you would have to fall back on GET/ANY to really get a VOID!
rebol2>> type? get/any 'x == unset!
But R3-Alpha decided to be more lenient in this respect, and Red followed the lead:
r3-alpha>> unset 'x r3-alpha>> type? :x == unset! red>> unset 'x red>> type? :x == unset!
I've always been skeptical of this, because quite often the reason you are using a GET-WORD! is because you think the thing in your hand might be a function and you don't want to call it. But when you let it mean "get a thing that's not set" as well, you're opening the doors to letting typos through:
return reduce ["My Action" :my-actionn] ; whoops, I meant MY-ACTION!
Is it worth the tradeoff? If anyone would say yes, it would probably be me... because I argue for the importance of being able to write truly generic code... so that usermode can be as rigorous as the internals. But I'm not really sure. Maybe most generic code should choke on VOID! unless you really wanted to process them... and maybe that added step of having to use GET/ANY is what it should take.
I feel :var should be the route to disarming functions/errors as the imperative usage—makes passing them on more intuitive.
I will point out that if we go back to the Rebol2 style, there's nothing stopping versions of the future from opening it back up to the R3-Alpha and Red style. But if people write code expecting GET-WORD!s to return void it will be harder to backpedal later when any significant codebases exist.
This leads me to think we might want to try going back to erroring on VOID! with GET-WORD! and see where the pain points are. There may be tools for addressing that pain that are shaped other ways.