I've run up against another ^WORD vs WORD issue, in the case of "Hot Potatoes".
For instance, VETO is implemented through a hot potato:
>> ~(veto)~
== \~(veto)~\ ; antiform (pack!) "hot potato"
The gimmick is that since it's a PACK! with an unlifted value in it, it can't be decayed normally. And so we can treat it as a lightweight signal that's error-like.
>> 1000 + 20 ~(veto)~ 300 + 4
** PANIC: Cannot decay hot potato PACK! ~(veto)~
Things that look for it can handle it specially, just as they could handle an ERROR! with a specific ID... it's just a much cheaper way of getting the same effect.
REDUCE and COMPOSE, but also PARSE groups, etc.
>> reduce [1000 + 20, if okay [~(veto)~], 300 + 4]
== \~null~\ ; antiform
Same Question Arises As For ^VOID, But...
It's pretty clearly nicer if you can just use the word VETO:
>> reduce [1000 + 20, if okay [^veto], 300 + 4]
== \~null~\ ; antiform
>> reduce [1000 + 20, if okay [veto], 300 + 4]
== \~null~\ ; antiform
But we also need to test for veto, and (veto? veto) has to work... so it would be a bummer if (veto? ^veto) failed because VETO was an ACTION!.
For VOID!s I did always wonder "is this rule really buying us anything"? And for hot potatoes, it seems it's buying even less.
The question we have to answer is if whatever protection we think we're getting from the rule is outweighing the damage we'd wind up doing trying to work around it.
Speaking completely generally, if you say x: y you don't have any particular guarantees... like "oh, I'm assigning one stable value to another stable value". Y could be a function.
If you write x: get $y and not x: get meta $y then this is a little different. You now explicitly know you're doing a non-^META get, and so we could say "therefore you know, you won't be getting any unstable antiforms back".
If we bent this rule for x: get $void and x: get $veto...how bad is it? And are they different?
There is a difference... in the sense that if you use a non-^META assignment, then the get $veto is producing a hot potato that is not assignable. Whereas non-^META assignment allows voids.
I kind of feel like that is different stakes. GET itself may return definitional failures (the erroring strategy for GET hasn't been completely worked through, but I think we'd be tying our hands if we didn't say that GET could return definitional errors to communicate information, at least on non-^META gets). But that might create some issues... if try get $veto suggested it wasn't able to get veto, vs. that it did and it was a hot potato...
The GET behavior and what WORD! does also doesn't have to be exactly the same...obviously they already aren't (a word runs a function, for instance).
It's definitely food for thought. I feel more uneasy about making void work vs. ^void than I do about saying that veto evaluates to the hot potato it contains. I definitely don't want to have to say (if condition [^veto]) and want to say (if condition [veto]). And I do like the idea that (veto? veto) and (veto? ^veto) both work.