Rebol2 had a strange concept of the ability to create aliases for words:
rebol2>> alias 'append "foo"
== foo
rebol2>> foo [a b c] <d>
== [a b c <d>]
rebol2>> foo: 10
== 10
rebol2>> append
== 10
(You might wonder why it takes a string, vs. being alias 'append 'foo. The problem is that if you tried that, the fact that merely mentioning words creates variables for them in historical Rebol would mean that FOO appeared to already exist as an unset variable. The alias wouldn't override it.)
Ren-C Does This With "DUAL States"
Instead of creating aliases in the symbol table, the slot for the variable stores the actual WORD! (or TUPLE!) with binding where the quantity for the variable would go.
However, that slot has its LIFT_BYTE set to the value for the "dual state" (currently 0, but it could be 255 if that made more sense for some reason).
If you multiply assign aliases, they will all get the same dual state and alias the same variable:
>> x: 10
>> y: z: alias $x
== \~(^x)~\ ; antiform (pack) "dual: alias"
>> assert [x = 10, y = 10, z = 10]
>> y: 20 ; writes to X, Z sees it also
>> assert [x = 20, y = 20, z = 20]
>> z: 30 ; writes to X, Z sees it also
>> assert [x = 30, y = 30, z = 30]
The trick with the dual band is that since packs store lifted values, anything not lifted can't decay. So it either has to panic or it has to do something else. In the case of states it understands in the dual band, it assigns those.
But it will decay by getting the value. So:
>> x: 10
>> decay alias $x
== 10
This means if you want to "break the aliasing chain" you use decay:
>> x: 10
>> y: decay z: alias $x
== 10
>> assert [x = 10, y = 10, z = 10]
>> y: 20 ; only updates Y which didn't become an alias
>> assert [x = 10, y = 20, z = 10]
>> z: 30 ; Z was assigned before the decay so it aliases X
>> assert [x = 30, y = 20, z = 30]
It Works With TUPLE! Too
This can be great for shorthanding things in code:
>> obj: make object! [field: 1020]
>> f: alias $obj.field
>> f
== 1020
>> f: 304
>> obj.field
== 304
It's New, And More Rickety Than It Should Be...
Right now it will get in an infinite loop if you alias variables to each other. I'm not sure exactly what to do about that--as not allowing aliases of aliases seems like it might be a bit heavy-handed.