[REBOL] Re: Competition - There must be a better way to .....
From: ale870::gmail::com at: 24-Nov-2007 15:55
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 <pwawood-gmail.com> 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