"UNSET!" values were extremely ornery in historical Rebol and Red. You couldn't assign them to variables:
rebol2>> x: print "message" message ** Script Error: x needs a value red>> x: print "message" message *** Script Error: x: needs a value
In Rebol2 and R3-Alpha you couldn't test them for conditional truth or falsehood, either:
rebol2>> if print "message" [1 + 2] message ** Script Error: if is missing its condition argument
But Red made the bizarre decision to say that "UNSET!" was truthy:
>> if print "message" [1 + 2] message == 3
Isotopes in Ren-C are a far more sophisticated story than UNSET!, and triggering errors in conditional slots is their raison d'etre. They guide you to finding mistakes in your reasoning:
>> value: false >> match [integer! logic!] value == ~false~ ; isotope >> if match [integer! logic!] value [print "You probably want this to print!"] ** Error: ~false~ isotope is not conditionally true or false, see DID and DIDN'T >> did match [integer! logic!] value == #[true] ; DID is isotope tolerant, and checks against pure NULL only >> if did match [integer! logic!] value [print "Isotopes saved the day!"] Isotopes saved the day!
So keeping that "ornery" behavior is important. But also important is not being ornery about assignment of QUASI! values via SET-WORD!.
It has applications everywhere...like in the round-tripping of OBJECT!s.
>> first [~] == ~ ; ordinary QUASI! of blank (can appear in blocks, etc.) >> ~ == ~ ; isotope (QUASI! -> isotope on evaluation) >> make object! [u: ~, q: first [~]] == make object! [ u: ~ q: '~ ] ; ^-- running this MAKE OBJECT! gets you back the isotope and BAD-WORD! correctly
But if you assign them via any evaluation (even a GROUP!) you will get an error.
>> x: print "Hi" Hi ** Error: Cannot assign isotope with SET-WORD!, see SET/ANY >> x: (~) ** Error: Cannot assign isotope with SET-WORD!, see SET/ANY
This seems like the best compromise to get the desired behavior.