Now's a good time to be looking at this question.
So with virtual binding, I think we're going to want to programmatically expose the virtual bind chain somehow or another.
>> a-obj: make object! [a: 10]
>> b-obj: make object! [b: 20]
>> block: [a b]
>> viewed: use a-obj (use b-obj block)
>> binding of viewed-with-c ; new idea: asking BINDING OF on a BLOCK!
== [#[object! [b: 20] #[object! [a: 10]] ; let's say list of 2 objects
It's technically possible to tie strings into the same basically giving it the knowledge that a block has:
use [x] [
s: "some-string (x)" ; *could* pick up `x` awareness automatically
But it doesn't have the natural dampening factor that regular virtual binding has, that whenever you copy something it resolves the binding at that time..dropping the chain. So string bindings would either need to be dropped automatically (and unpredictably) or the virtual chains would just grow indefinitely.
The indefinite growth is especially bad considering it'd be a feature you'd use relatively rarely.
But binding strings explicitly might be okay:
>> obj: make object! [x: 10 y: 20]
>> viewed-str: use obj "The (x) and the (y)"
>> binding of viewed-str
== [#[object! [x: 10 y: 20]]
I think it's misleading to do this kind of operation with BIND if BIND is presumed to be mutating. Because it's not like you'd be giving this binding to all instances of the string...just the result would have the "view". So it's "virtual"...you must save the result to use it.
e.g. this would be meaningless:
>> bind str obj ; no result saved would mean it did nothing
This makes me feel like BIND on WORD! is misleading... and maybe we should go with use obj word instead of bind word obj.
Anyway, I might work up a test on this strings-having-context concept here in a bit.