Hi, List,

I am working on an enhanced version of a field widget.  In order to get the
enhanced functionality, I need to modify a function within the context of
edit-text in REBOL.  The code is too long for easy use on the list (in my
opinion), so I have created a very simple example that (hopefully) recreates
the problem in the "small."

Here is my hypothetical context.  It contains a local variable and a
function that prints that variable.

    my-context: context [
        local-var: 5
        my-func: does [
            print local-var
        ]
    ]

where then executing:

    my-context/my-func  ;yields 5

Now, let us say that I wish to dynamically change the function in this
object to the following:

    my-func: does [
        print ["new print" local-var]
    ]

where my-func will be bound into the context of my-context.

For your ease in running the code samples, I have included the original
context object with each example.  In my non-hypothetical case, the shortest
code method would be to change the code in place like:

;### Method 1
    ;original
    my-context: context [
        local-var: 5
        my-func: does [
            print local-var
        ]
    ]
    ;make change
    insert remove remove pick pick pick my-context 2 3 2 [print ["new print"
local-var]]

This makes my-context "look" correct (meaning that the data representation
of the code is correct when viewed with probe), but the inner function is
not bound into the context:

    my-context/my-func ;expectedly yields an error

For completeness (to be sure that I understood the precept behind bind), I
also directly reassigned the function:

;### Method 2
    ;original
    my-context: context [
        local-var: 5
        my-func: does [
            print local-var
        ]
    ]
    ;make change
    my-context/my-func: does [
        print ["new print" local-var]
    ]

and again confirmed that an error occurs with my-context/my-func, because it
has not been bound into the context.

In the past, my tried and true way to make it work has been to "re-make" the
object with the new function:

;### Method 3
    ;original
    my-context: context [
        local-var: 5
        my-func: does [
            print local-var
        ]
    ]
    ;make change
    my-context: make my-context [
        my-func: does [
            print ["new print" local-var]
        ]
    ]

which then works correctly when executing my-context/my-func (yields "new
print 5").

I understand the basic concepts behind scope and binding, and how these play
out in REBOL.  It seems as though it should be easy enough to use bind, but
I can't figure out how to (successfully) do this when changing a function
within a context, at least with methods 1 and 2.  Nothing wrong with method
3, but I would love to also be able to use method 1 or 2 with a
strategically and correctly placed bind statement.  Any ideas?

--Scott Jones

-- 
To unsubscribe from this list, please send an email to
[EMAIL PROTECTED] with "unsubscribe" in the 
subject, without the quotes.

Reply via email to