So I think I can make a seemingly rapid decision here--that's actually based largely on prior experience:
IN should shift to being an operation that will not override an existing binding (modulo the merge of holepunches mentioned)...so merely adds bindings to things that don't have them
-
It will be used extremely frequently in the proposed binding model where the majority of values are unbound, so being shorter than BIND will actually add up.
-
There's less potential for confusion in ordering of arguments. While
value in context
might make some sense,in value context
does not. So if you can at least remember that IN is a prefix operation of arity-2, the order is clearlyin context value
- Not making mistakes in ordering is especially important since in block1 block2 will be a perfectly valid call.
-
The parameter ordering is the most pleasing to look at when passing quoted bodies of code as a second argument, which would be common.
IN Will No Longer Be Used For Testing WORD!-in-OBJECT!
Making IN the fundamental merge-binding-operator would kill off historical applications such as using it for looking up words in objects, which have been around since Rebol2. (It's a secondary behavior to being the reverse-order operator for BIND on blocks.)
rebol2>> obj: make object! [x: 10 y: 20]
rebol2>> x: <global>
rebol2>> word: in obj 'x ; Note: incoming X bound to global X
== x ; Note: output is rebound to OBJ
rebol2>> get word
== 10
rebol2>> in obj 'z
== none
In the new formulation, 'x and 'z would wind up losing their quotes and being passed to IN as unbound. Then an X bound into OBJ would be returned, and an unbound Z would pass through. Had a bound word been passed in, it would not be rebound.
For a replacement of the historical usage, I'll suggest the more conditional sounding HAS...which is not used in Ren-C for anything else. HAS would be for looking up words only, return null if not found, otherwise override any existing binding on the word.
So What Will BIND Be For In The New Model?
...don't know.
Perhaps it's single-arity and means BIND-TO-CURRENT (which seems a little...weak). Or maybe it could be saved for "the BIND dialect" which assists in various patterns that aren't easily solvable by just in context value and in context unbind value alone.
Perhaps "unuse" and other patterns that are similar to hole punching would all be done with the BIND dialect, as a mini-language for bind merging algorithms.