Re: Functional Expression Meaning (was:A Functional Expression Trick)
- To: mathgroup at smc.vnet.net
- Subject: [mg23934] Re: Functional Expression Meaning (was:[mg23859] A Functional Expression Trick)
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Fri, 16 Jun 2000 00:57:17 -0400 (EDT)
- References: <NDBBJGNHKLMPLILOIPPOIEEHCBAA.djmp@earthlink.net>
- Sender: owner-wri-mathgroup at wolfram.com
David,
Thanks for the amendment.
It looks though as if the extra rule needs to be in parallel with the old
one and not after it:
toFunc::usage = "toFunc[expr] will convert an expression of pure functions
into a pure function.";
OLD FORM
toFunc[expr_] :=
ReleaseHold[
Function @@ ({expr} /. (F_ /; F === Function)[vars_, body_] :>
Apply[F[vars, Hold[body]],
Slot /@ Range[Last[Dimensions[Unevaluated[{vars}]]]]] /. (F_
/;
F === Function)[body_] :> Hold[body])]
toFunc[Function[x, Function[#^2 + x]]]
Hold[#1^2 + #1] &
toFunc[ Function[2# + Function[x, x^2]]]
2*#1 + (Function[x, Hold[x^2]]) @@
Slot /@ Range[Last[Dimensions[Unevaluated[{x}]]]] &
NEW FORM
toFunc[expr_] := ReleaseHold[Function @@ ({expr} /. {
(F_ /; F === Function)[vars_, body_] :>
Apply[F[vars, Hold[body]],
Slot /@ Range[Last[Dimensions[Unevaluated[{vars}]]]]],
Function[body_] :> Hold[body]
}
)
]
toFunc[Function[x, Function[#^2 + x]]]
(#1^2 + #1 & ) &
toFunc[ Function[2# + Function[x, x^2]]]
2*#1 + (Function[x, x^2]) &
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565
----- Original Message -----
From: "David Park" <djmp at earthlink.net>
To: mathgroup at smc.vnet.net
"Allan Hayes" <hay at haystack.demon.co.uk>
Subject: [mg23934] RE: Functional Expression Meaning (was:[mg23859] A Functional
Expression Trick)
>
>
> > -----Original Message-----
> > From: Allan Hayes [mailto:hay at haystack.demon.co.uk]
To: mathgroup at smc.vnet.net
> > Dear David and Hartmut,
> > I have come across some problems with Hartmut's solution, toFunc,
> > as written
> > up by David.
> > I offer new version, toFunc2
> >
>
> Dear Allan and Hartmut,
>
> Allan's solution is more robust than Hartmut's, but it leaves out the case
> of pure functions in short form, using slot numbers directly. So I added
an
> extra rule for that case. Here is it:
>
> toFunc::usage =
> "toFunc[expr] will convert an expression of pure functions into a pure
\
> function.";
> toFunc[expr_] :=
> ReleaseHold[Function @@ ({expr} /.
> (F_ /; F === Function)[vars_, body_] :>
> Apply[F[vars, Hold[body]],
> Slot /@ Range[Last[Dimensions[Unevaluated[{vars}]]]]
> ]
> /. (F_ /; F === Function)[ body_] :> Hold[body]
> )]
>
> I think this is a very useful routine. Thanks to both of you.
>
> David Park
> djmp at earthlink.net
> http://home.earthlink.net/~djmp/
>