Don't know if you tried this, Joel, but here's a few more interesting
lines to add to your example. 

    >> a: 1
    == 1
    >> b: 2
    == 2
    >> e: [a b c]
    == [a b c]
    >> print e
    ** Script Error: c has no value.
    ** Where: c
    >> f: func [n /local c][c: n  bind e 'c  print e]
    >> f
    ** Script Error: f is missing its n argument.
    ** Where: f
    >> f 99
    1 2 99
    >> print e
    1 2 99
    >> bind e 'e
    == [a b c]
    >> print e
    ** Script Error: c has no value.
    ** Where: c
; (more)
    >> f 99
    1 2 99
    >> print e 
    1 2 99
; 'c is restored to the 'e context
    >> c: 12
    >> bind e 'e
    == [a b c]
    >> print e
    >> 1 2 12
; 'e binds to 'c in the this context
    >> unset 'c
    >> print e
    ** Script Error: c has no value.
    ** Where: c
; no 'c in this context now
   >> f 99
    1 2 99
    >> print e
    1 2 99
    >> bind/copy e 'e
    == [a b c]
    >> print e
    1 2 99
; with the copy refinement, 'e binds to the 'c in the 'f local context.
    >>f 98
    1 2 98
    >>print e
    1 2 98
; and when the 'c in the the 'f local context changes, so does the 'c
in the 'e local context
   >>a: 65
   65
   >>print e
    65 2 98
; and we are still bound to the orignal 'a

So to retain a word set to a value in a local context, we can use the
'bind/copy refinement. 

At first, I was thinking we were copying the 'c from the 'f context.
But I guess we're really copying the 'c from the 'e context. Bind is
operating in the block outside of 'e and so 'c does not exist to it.
But I guess the /copy refinement recreates the local 'c so that bind
can use it. It doesn't seem to be a "copy" in the usual sense though,
since it appears to be the same value first created in 'f.

Just as a value can be shared between words, perhaps a word can be
shared among contexts.

-Ted.

Reply via email to