Further on this point: note that when you use variables, that "shields you from evaluation"... in the sense that the variable fetch uses up the evaluation, giving you the unevaluated result of the variable contents:
>> animal: 'zebra
== zebra
>> if animal = 'zebra [print {It's a zebra.}]
It's a zebra.
But when you are using the API, you don't have this step.
REBVAL* animal = rebValue("'zebra");
rebElide("if", animal, "= 'zebra [print {It's a zebra.}]");
The animal is a C variable, not a Rebol-variable as WORD!. Hence it's spliced into the code as-is without protection via its "name". So it's as if you wrote:
eval compose [if (animal) = 'zebra [print {It's a zebra.}]]
=>
eval [if zebra = 'zebra [print {It's a zebra.}]]
So you'll get something like a zebra-is-undefined error, because it will look up the first zebra as a WORD! variable under evaluation.
An advantage to arbitrary quoting is that you can get that same protection you would have gotten from a variable reference on a value regardless of what it is. Ren-C's COMPOSE can transfer quoting or quasi levels from GROUP!s onto the spliced items:
eval compose [if '(animal) = 'zebra [print {It's a zebra.}]]
=>
eval [if 'zebra = 'zebra [print {It's a zebra.}]]
In the API, this can be done with a quoting instruction:
rebElide("if", rebQ(animal), "= 'zebra [print {It's a zebra.}]");
Regardless of what animal is (INTEGER!, GROUP!, BLOCK!, something already QUOTED!, etc.) you get that one step of quote, and you may not know if you need it or not. This is just another facet beyond the applications of quoting to arbitrary meanings in dialects.
Note that Ren-C's COMPOSE has some other tricks up its sleeve, e.g. transferring colons onto things that support them:
>> compose [(animal): "not a good pet"]
== [zebra: "not a good pet"]