So you're right, that this has to be framed in terms of what are the operations a real language must support, to which these forms pertain.
I've not always communicated this well. (It has been a long design process, with some wrong turns here and there.) But now that everything is firmed up, and AI are available to assist in the communication loop--let me try to give you a good answer.
Any language that wants to be composable ends up needing all of the following:
- splicing zero-or-more values into a sequence
- returning zero-or-more values from a function
- distinguishing "nothing supplied" from "supplied but empty"
- opting out of evaluation entirely
- making something vanish without leaving a trace
Those needs are not philosophical. They appear the moment you build macros, defaults, control flow, or abstractions that compose.
Once you accept those needs, the structures follow mechanically:
- splicing requires something that splices as zero items
- multi-return requires something that represents zero returns
- non-evaluation requires a value that opts out of running
- disappearance requires a form that leaves no value behind
At that point, the only remaining choice is whether these distinctions are:
- explicit and checkable, or
- implicit, informal, and carried in people’s heads
When it’s (2), the complexity doesn’t go away.
It reappears as flags, conventions, sentinel values, and "you just have to know".
So the isotopic model is not adding concepts--it's making existing ones stop overlapping by accident.
If two of these were truly the same, they would be interchangeable.
They aren’t. Each answers a different yes/no question programmers already rely on.
That’s why this feels heavier at first: ambiguity feels light until you try to reason about it.
The real question isn’t "why so many?"
It’s: which of those operations are you willing to give up--or encode badly?
As Of 2025, I Feel The Model Is Complete
There are now what might be inventoried as "6 kinds of nothing", though they are all instances of states that have their own justifications for existence.
-
BLANK! - an invisible item you can put in lists that separates evaluations, which you can tell is there due to commas.
-
NULL (antiform of the word!
null, a "keyword!") -
a PACK! with NULL in it - a.k.a. "heavy null"
SPACE (a.k.a. the underscore character literal for a space) is really just an honorable mention here. It isn't really "nothing" since it's not an "antiform", can appear in BLOCK!, and isn't overwritten by functions like DEFAULT.