Now I don't remember the function, but in Rebol you can dynamically get the
variables used in one function. It means you could create a bind at runtime
using such variables.. The problem is in this way you cannot make difference
between locals and globals.
Can you establish a "standard" and, for example, expect that the new dynamic
context may contain a default function (e.g.: called (binder) ) to be called
to get/set bind variables? This is the way that in languages like java use
with "interface" or abstract classes (like a "promise": you simply say that
the new context must contain a specific function(s) ).

On Nov 25, 2007 1:45 AM, Peter Wood <[EMAIL PROTECTED]> wrote:

>
> Alessandro
>
> I think the problem that you've solved is slightly different to mine. I
> need to add words to the context after it has been created as I don't
> know what variables will be supplied until the script is running.
>
> Regards
>
> Peter
>
> On Saturday, November 24, 2007, at 10:55  pm, Alessandro Manotti wrote:
>
> > I had the same problem (similar problem) when I created Framework
> > "Laccio".
> > I solved simply creating a variabile in the external container:
> >
> > internal-variable: none
> >
> > ctx1: context [
> >   internal-variable: "A"
> > ]
> >
> > I used this "trick" to create several instances of the same Layout
> > (View
> > Layout). See the following real example:
> >
> > ctx1: context [
> >   myButton: none
> >
> >   myLayout: [
> >     myButton: button "Click me"
> >   ]
> > ]
> >
> > view layout ctx1/myLayout
> >
> >
> >
> > If you think I'm to the right way, you can donwload my framework from
> > http://laccio.wordpress.com then take a look to the viewer
> > implementation
> > (not the controller).
> >
> >
> >
> >
> >
> >
> > On Nov 24, 2007 5:13 AM, Peter Wood <[EMAIL PROTECTED]> wrote:
> >
> >>
> >> Seeing the great response to previous competitions, I thought that I'd
> >> start one too.
> >>
> >> As part of a test framework I'm working on, I want to evaluate the
> >> test
> >> code in a separate context to avoid clashes between the code being
> >> tested and the test framework code.
> >>
> >> I found it wasn't as easy as simply binding the block to a different
> >> context.  I've come up with a method based on adding new words in the
> >> code to be evaluated to the context before binding them. It seems to
> >> work (I haven't tested it extensively yet) but it's complicated and
> >> uses recursion.
> >>
> >> I'm sure many of you can come up with simpler and non-recursive
> >> solutions?
> >>
> >> My code:
> >>
> >>  eval-ctx: make object! [
> >>   anchor: none
> >>   eval: function [code-block [block!]] [
> >>     result
> >>   ][
> >>     bind code-block 'anchor
> >>     if error? set/any 'result try code-block [
> >>       result: disarm result
> >>     ]
> >>     result
> >>   ]
> >> ]
> >>
> >>
> >> evaluate: function [code-block [block!]] [
> >>   words-to-add
> >>   find-words-to-add
> >>   p
> >>   w
> >> ][
> >>   words-to-add: copy []
> >>   find-words-to-add: func [code-block [block!]][
> >>     parse code-block [
> >>       any [
> >>         set w block! (
> >>           find-words-to-add w             ;; recursive call
> >>         )
> >>         |
> >>         set w set-word! (
> >>           if not in eval-ctx to word! w [
> >>             insert insert words-to-add reduce w none
> >>           ]
> >>         )
> >>         |
> >>         'set set w lit-word! (
> >>           if not in eval-ctx w [
> >>             insert insert words-to-add to set-word! w none
> >>           ]
> >>         )
> >>         |
> >>         set p path! set w lit-word! (
> >>           if 'set = first p [
> >>             if not in eval-ctx w [
> >>               insert insert words-to-add to set-word! w none
> >>             ]
> >>           ]
> >>         )
> >>         |
> >>         skip
> >>       ]
> >>     ]
> >>   ]
> >>   find-words-to-add code-block
> >>   if words-to-add <> [] [
> >>     eval-ctx: make eval-ctx words-to-add
> >>   ]
> >>   eval-ctx/eval code-block
> >> ]
> >>
> >> A sample:
> >>
> >>>> evaluate [test1: "peter"]
> >> [test1: "peter"]
> >> == "peter"
> >>>> test1
> >> ** Script Error: test1 has no value
> >> ** Near: test1
> >>>> probe eval-ctx
> >> make object! [
> >>     anchor: none
> >>     eval: func [code-block [block!] /local
> >>         result
> >>     ][
> >>         bind code-block 'anchor
> >>         if error? set/any 'result try code-block [
> >>             result: disarm result
> >>         ]
> >>         result
> >>     ]
> >>     test1: "peter"
> >> ]
> >>
> >> Regards
> >>
> >> Peter
> >>
> >> --
> >> To unsubscribe from the list, just send an email to
> >> lists at rebol.com with unsubscribe as the subject.
> >>
> >>
> >
> >
> > --
> >
> > //Alessandro
> >
> > http://sguish.wordpress.com
> > http://laccio.wordpress.com
> >
> >
> > --
> > To unsubscribe from the list, just send an email to
> > lists at rebol.com with unsubscribe as the subject.
> >
>
> --
> To unsubscribe from the list, just send an email to
> lists at rebol.com with unsubscribe as the subject.
>
>


-- 

//Alessandro

http://sguish.wordpress.com
http://laccio.wordpress.com


-- 
To unsubscribe from the list, just send an email to 
lists at rebol.com with unsubscribe as the subject.

Reply via email to