I might as well throw in the adjunct question of: "Why shouldn't VOID be done with ~void~ antiform?"
It used to be said of NULL that it had "no representation". That's true of antiforms also, but there's been a standard that the interface shows an antiforms by printing the quasiform and then commenting it as "oh, it's actually an antiform state"
At that time, the console had a special exception for displaying nulls. And the "quoted" form of null was just a single apostrophe with nothing after it:
>> null
; null
>> quote null
== '
>> '
; null
This was all conceived before the idea of having a meta state for void, because voids just vanished. But as things shuffled around, I came to think that this "no representation" made more sense for voids...
>> '
>> quote void
== '
>> meta void
== '
Having a META state that is quoted vs. quasi puts VOID in a bizarre middle ground of not being an antiform. Yet void can't be put in a block. Though I've argued that we might also see it as that you can put infinitely many voids in a block...
>> append [a b c] '
== [a b c]
>> append [a b c] if false ['d]
== [a b c]
>> first []
== ~null~ ; anti
>> append [a b c] first []
** Error: Can't append ~null~ antiform (see MAYBE)
>> maybe first []
>> append [a b c] maybe first []
== [a b c]
Generally speaking I'm pleased with that. Though it means if you wind up setting a variable to void, it will look kind of slight:
>> make object! [x: comment "hi"] ; might require a SET/ANY or similar
== make object! [
x: '
]
Why not push ithe other way, and say that voids are antiforms?
One key value of saying that void states are "ordinary" is that it means they have an isotopic form, and that isotopic form is rendered as just ~
.
This isotopic void state of ~
is being used as the "truly unset" state. An even meaner idea of complete absence of value than void. I'm of the belief that it's important to have this not be the same thing as void, because the tolerance of void by so many constructs (including things like ANY and ALL to skip them, or opting out of APPENDs, or making SELECTs just return a null).
The design of the system is such that the quote byte of 0 means isotopic status (e.g. "quote level negative 1" is represented by 0), and the void type is a 0 byte. So you can memset() an area to 0 and get all unset states (typically an optimized operation). And the operating system clears all memory to 0 before giving it to your application as well. It's kind of pleasing that such a representation gives you a nice unset state.
It seems to me that the pieces of the puzzle fit together better this way.