Rooting around Rebol sources as the official guide book recommends, I came
across the following function (which would make my /refinements refinement
unnecessary. Now to get it to work....

>> help refined
USAGE:
    REFINED f refinements

DESCRIPTION:
     Create a function doing the same thing as a function with given
refinements does
     REFINED is a function value.

ARGUMENTS:
     f -- (Type: any-function)
     refinements -- (Type: block)

(SPECIAL ATTRIBUTES)
     catch


----- Original Message -----
From: "Brett Handley" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Saturday, August 12, 2000 7:20 PM
Subject: Re: [REBOL] Passing refinements to sub functions. Re:


> Thanks for your response Michael.
>
> Now that's an interesting idea.
>
> I think your approach is good at getting the refinements of the
> higher-function processed as a set, but it obscures what happens after
that.
>
> My latest approach has been to use an additional refinement on the
> sub-function called /refinements. This has an argument of type block that
> contains pairs of refinement-name and refinement-value.
>
> Inspired by your work I produced this.
>
> main-func: function [/va /vb /vc][this-code refine-values r][
>  sub-func/refinements refinements-to-block :main-func va
> ]
>
> sub-func: function [/refinements refine-list][va vb vc][
>     do bind refine-list 'va
>     print ["va:" va]
>     print ["vb:" vb]
>     print ["vc:" vc]
> ]
>
> refinements-to-block: function [
>     hi-func
>     'sample-refinement
> ][refinement-block][
>     refinement-block: copy []
>     foreach r first :hi-func [
>         if (refinement? r) and (r <> /local) [
>             append refinement-block to-set-word r
>             append/only refinement-block to-paren bind reduce [to-word r]
> :sample-refinement
>         ]
>     ]
>     compose refinement-block
> ]
>
> It results in this:
>
> >> main-func/vb/vc
> va: none
> vb: true
> vc: true
>
> Of course it doesn't handle any refinement arguments.
>
> Brett.
>
> ----- Original Message -----
> From: <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Wednesday, August 09, 2000 1:35 AM
> Subject: [REBOL] Passing refinements to sub functions. Re:
>
>
> >
> > Well since I know you're thinking about asking for the solution I had
come
> > up with, I'll go all out and post it here. The actual solution to loop
> > through the function items (refinements) is not much code, but is
tedious
> > and messy-looking. I feel like I'm going through alot of trouble to hide
> > this and save a few characters in the "high-level" function, but the
> result
> > is a little easier on the eye and made me learn about contexts and
'bind.
> >
> > ; Say you have a high-level function (main-func) with a list of
> > refinements, and you want to pass all of these refinements to a
> lower-level
> > function (sub-func). The bare parameter-passing code is:
> >
> > main-func: function [/va /vb /vc][this-code refine-values r][
> >      this-code: make-code "main-func" "sub-func"
> >      bind this-code 'some-global bind this-code 'refine-values
> >      do this-code
> > ]
> >
> > sub-func: function [param-list][va vb vc][
> >      set [va vb vc] param-list
> >      print ["va:" va]
> >      print ["vb:" vb]
> >      print ["vc:" vc]
> > ]
> >
> > ; Resulting in:
> > >> main-func/va/vc
> > va: true
> > vb: none
> > vc: true
> >
> > ; To support this you must define the following globally:
> >
> > some-global: none
> > make-code: function [hi-func [string!] lo-func [string!]][code][
> >      code: copy {
> >           refine-values: make block! []
> >           foreach r first :hi-func [
> >                if (refinement? r) and (r <> /local) [
> >                     append refine-values get bind to-word r
'refine-values
> >                ]
> >           ]
> >           lo-func refine-values
> >      }
> >      replace/all code "hi-func" hi-func
> >      replace/all code "lo-func" lo-func
> >      return(to-block code)
> > ]
> >
> > - Michael Jelinek
> >
>
>

Reply via email to