You might wonder why you're not allowed to just write:
>> if 1 = 1 "hello"
== "hello"
So... we actually tried allowing that for a while. I was the person who advocated for it (with support from @IngoHohmann, @rgchris, and others). My argument was that in Rebol's freewheeling style, you might want to spend your delimiter points on the condition instead of the branch. For example, which of the following two seems to get useful mileage out of the delimiters?
>> if (1 = 1) "hello"
== "hello"
>> if 1 = 1 ["hello"]
== "hello"
Hence we had some experience with what happens when all values were permitted.
Problem: BLOCK! Branches Act Fundamentally Different
Blocks are executed as code. So if you see an expression that isn't a literal used as a branch, you are disoriented. As a reader, you are uncertain whether that expression's evaluation is the end of the evaluation...or if another will happen. And as a writer, you are going to be prone to making mistakes.
This problem is not new, and hits every new user when PRINT treats blocks differently.
>> x: 10
-- lots and lots of code --
>> print x
10
>> x: [format hard drive]
-- lots and lots of code --
>> print x
-- oops --
I've long believed that is a weakness, and a fairly serious one at that. So we should go more toward finding solutions to that category of problem, vs. propagating it more widely and making the system more unpredictable on the whole...for limited value.
But Don't Despair! Ren-C Has "Soft Quoted Branches!"
You may not be able to put just anything in a branch slot, but you can put any quoted thing!
>> if true '<tag>
== <tag>
This flexible approach permits even blocks to be provided literally:
>> either true '[1 + 2] [1 + 2]
== [1 + 2]
>> either false '[1 + 2] [1 + 2]
== 3