I'd guess the sort of competition in the homoiconic space I'd have in mind would be people using things like Clojure (or ClojureScript). But I think if you look at things like Julia or Go, there are some real strengths there. And Rust and Haskell are good projects for those who want to step away from popularity but get rigor as a benefit.
The language itself wasn't composable the way one might like languages to be
I think if you look at the FOR-BOTH example in Ren-C, it really tells a story that isn't there in historical Rebol.
for-both: lambda [@(var) blk1 blk2 body] [
all [
^ for-each (var) blk1 body then lift/
^ for-each (var) blk2 body then lift/
] then unlift/
]
It's just across the board more solid. Not only does definitional RETURN mean that a return in the body will act as the person using the loop would expect, but BREAK and CONTINUE will behave correctly...returning the aggregate loop result.
>> for-both 'x [1 2] [3 4] [print ["x is" x], x * 10]
x is 1
x is 2
x is 3
x is 4
== 40
>> for-both 'x [] [] [print ["x is" x], <result>]
>> for-both 'x [1 2] [3 4] [print ["x is" x], if x = 2 [break]]
x is 1
x is 2
== \~null~\ ; antiform
All the ideas come together here.