HI Alessandro

The code that I posted seems to do what I want: it finds new variables in
the code to be tested, adds equivalent words to the context and then binds
the code to be tested to the context for the test code.

I think there must be a better way to do what I want which is why I started
the competition.

As for the function, you may be thinking of first which when applied on a
function gives the argument block; second gives the body of the function.

>> first :append
== [series value /only]
>> second :append
== [
    head either only [
        insert/only tail series :value
    ] [
        insert tail series :value
    ]
]

If first is applied to an object, you get a list of the members including
self:
>> a: make object! [
[    b: 1
[    c: 2
[    d: 3
[    ]
>> first a
== [self b c d]

Regards

Peter




On 25/11/2007, Alessandro Manotti <[EMAIL PROTECTED]> wrote:
>
> 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.
>
>


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

Reply via email to