Rebol2 and Red both have a console property that when the console sees an UNSET!, it prints nothing:
>> block: reduce [<a> #[unset!] <b>]
== [<a> unset <b>] ; bad rendering, conflates #[unset!] with the word `unset`
>> first block
== <a>
>> second block
>> third block
== <b>
This doesn't provide the best grounding in the console, especially considering that in their world an UNSET! is a reified value that can be found in a block.
However, returning an UNSET! is how functions like PRINT avoid outputting anything with == in the console:
rebol2>> print "Notice no == result"
Notice no == result
rebol2>> type? print "Test"
Test
== unset!
But What Result Should Ren-C Suppress?
Ren-C has multiple antiforms which might be considered candidates for not displaying, with differing claims on the title of "nothingness"
- VOID! (antiform COMMA!)
- HEAVY VOID empty PACK! (antiform GROUP!)
- TRASH (antiform RUNE!)
The voids kind of go together as a set.
It might seem to make the most sense to have the VOIDs not print anything...since there is no value to be gotten out of them. Then trashes print out the standard isotopic form.
Such a world would look like this:
>> ~
>> ~()~
>> lift ~()~
== ~()~
>> ~#[some trash]#~
== \~#[some trash]#~\ ; antiform (void!)
If you buy into that, it might seem to make a lot of sense to have functions like PRINT and HELP return HEAVY VOID.
BUT as I explain in "Why doesn't PRINT return VOID", there is a bit of a pitfall. VOIDs (heavy or otherwise) are friendly in terms of opting out of things:
>> append [a b c] print "If PRINT returned void..."
If PRINT returned void...
== [a b c]
This seems too friendly to me. There's another possibility of returning VOID and being vanishable...
>> print "If print was returned void"
If print returned void
>> append [a b c] print "If print returned void"
If print returned void
== [a b c]
>> 1 + 2 print "If print returned void"
If print returned void
== 3
So returning TRASH feels like it makes the most mechanical sense...it has the right amount of ornery-ness:
>> print "Mechanically this works best"
Mechanically this works best
== \~#[print]#~\ ; antiform (trash!)
But it's ugly to display the TRASH! after every HELP or PRINT or other function.
Historically I've gone with TRASH being invisible, and VOIDs printing a result.
>> ~#[trash]#~
>> ()
== \~\ ; antiform (void!)
But I've given a try at printing the results always to see what my feelings are.