Arturo: "Rebol-inspired" Language

That was presumably born of the feeling that TYPE was too much a "noun" variable name to be "verbified"...so it was chosen to use the ? to "queryify it". I'd like to see more nouns retaken by default, e.g. switch to HEAD OF instead of HEAD.

The ability to make fast specializations with POINTFREE comes in handy here. I think it's more about letting people bend to what they want...fast...than any particular prescriptivism.

Been there, tried that.

The design of VOID is such that it represents a "non-value", e.g. it cannot be put in a BLOCK!. It is chosen as the exclusive "non-result"...returning void means no branch ran. So if a branch happens to incidentally evaluate to void or null, it becomes something known as a "boxed void" or "boxed null"... in a multi-return parameter pack antiform with only one item in it.

>> if null [<x>]
== ~void~  ; anti

>> if okay [void]
== ~[~void~]~  ; anti

This allows one to discover from the outside of a branching construct whether a branch was taken or not, with only one version.

Note: Generalized isotopes were added after this thread was initially written, and are more nuanced than what was originally referenced. This thread has been mercilessly wiki-edited to reflect the modern concept.

loop 1..5 'x ->
   print [x "is" if odd? x -> "not" "even"]

I do think that the arrows have a disadvantage vs blocks in that they aren't paired delimiters, so you're paying two characters already without establishing the pair. (That, and I've found them very good for lambda.)

One advantage of VOID being non-valued is that it is unambiguous what you mean when you say:

 >> compose [<a> (if null [<b>]) <c>]
 == [<a> <c>]

The VOID can't be mistaken for anything that could be put into a block (as opposed to Rebol2's #[none]...Ren-C uses several other placeholder types, like _ as BLANK! and ~ as "TRASH"). So VOID really can vaporize.

2 Likes