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 two antiforms which might be considered candidates for not displaying... VOID and NOTHING.
Because voids vanish, it might seem to make the most sense to have voids not print anything, and trashes print out the standard isotopic form:
>> void
>> quote void
== ~void~
>> ~
== ~ ; anti
Looking at this, it might seem to make a lot of sense to have functions like PRINT and HELP return VOID.
BUT as I explain in "Why doesn't PRINT return VOID or NIHIL", there is a bit of a pitfall. Voids 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 NIHIL, which would prohibit use as an argument. It would wind up making an evaluation appear to be void if no other expressions were in play...but if other expressions were involved it would let them fall out
>> print "If PRINT returned nihil"
If PRINT returned nihil
>> append [a b c] "If PRINT returned nihil"
If PRINT returned nihil
** Error: APPEND is missing its VALUE argument
>> 1 + 2 print "If PRINT returned nihil"
If PRINT returned nihil
== 3
So returning NOTHING 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
== ~ ; anti
But it's ugly to have that == ~ ; anti after every HELP or PRINT or other function.
Historically I've gone with NOTHING being invisible, and VOID printing a result.
>> ~
>> void
== ~void~ ; anti
But I've given a try at printing the results always to see what my feelings are.