Clarity + Brevity vs. NULL, BLANK, TRASH, VOID...

@hostilefork says:

I think any illusions of Ren-C being able to bring evaluator "safety" to a fundamentally unsafe language are being stripped away with time. Instead, what's actually happening is that the features are getting laser-calibrated to where an informed programmer can write short, correct, code easily... the right thing is the short thing, not something riddled with edge-case handling.

Clarity is a catalyst for safety in a language. But beyond that, the bias seems tipping ever toward being clean and powerful enough to "make your own you-made-a-mistake-catching-safety mechanisms"...

Clarity and brevity are two fundamental qualities of good writing. I think that applies to programming as well. Also 4 concepts so close (NULL, BLANK, TRASH and VOID), make me look for a fundamental problem in the language, or they do not have adequate names.

I do not quite understand the usefulness of these 4 variants but should not there be one, or several but named to make understand to which functionalities of the language they relate (block, value, refinement ...)? Maybe I get it wrong.

2 posts were split to a new topic: Old Response Thread to LkpPo's "Too Many Notes"

"I don't understand. There are just as many notes, Majesty, as are required. Neither more nor less." :slight_smile:


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:

  1. explicit and checkable, or
  2. 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.

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.

1 Like