       Re: Making a function dynamically define another conditional function...

• To: mathgroup at smc.vnet.net
• Subject: [mg21745] Re: Making a function dynamically define another conditional function...
• From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
• Date: Thu, 27 Jan 2000 22:56:28 -0500 (EST)
• Organization: Universitaet Leipzig
• References: <86md60\$2cr@smc.vnet.net>
• Sender: owner-wri-mathgroup at wolfram.com

```Hi Paul,

with

TestFn[data_List] := Module[{args, lst}, ClearAll[f];
lst = {x + First[#] , x == Last[#]} & /@ data;
( f[x_] = #) & /@ (ReleaseHold[Condition[#1, Hold[#2]] & @@@ lst])
]

and

TestFn[{{1, 2}, {3, 4}, {5, 6}}]

f[x_] = 1 + x /; x == 2
f[x_] = 3 + x /; x == 4
f[x_] = 5 + x /; x == 6

Since the Condition[] has the HoldAll attribute your version can't work.
Using my construction with out the Hold[] in Condition[#1,Hold[#2]] will
also not work because the condition is evaluatet and fails. When the
result us enclosed in Condition[] one can release the Hold[] bcause
Condition[] will not evaluate. Finaly the function definition can be
created.

Hope that helps
Jens

Paul Howland wrote:
>
> How can I make a function dynamically define a conditional function?
>
> Given a list of arguments {{a,A}, {b,B}, ...} I want to write a function
> that will take these arguments, and generate a new function, f say,
> which is defined as (for example):
>     f[x_] := x+a /; x==A
>     f[x_] := x+b /; x==B
>     etc.
>
> So, the obvious solution is to define a function as follows:
>
> In := TestFn[data_List] := Module[{args},
>             ClearAll[f];
>             Do[
>                 args = data[[i]];
>                 f[x_] = x + args[] /; x==args[],
>                 {i, Length[data]}
>             ]]
>
> and call it using something like TestFn[{{1,2},{3,4},{5,6}}].
>
> But this doesn't work (see attached notebook) as it appears that
> Mathematica does not evaluate any part of the condition at the time of
> definition, so args[] remains unevaluated.  As a consequence, the
> resulting function definition is not properly defined.
>
> So, the obvious solution to this is to wrap Evaluate[] around the
> condition (i.e. define the function as f[x_] = x + args[] /;
> Evaluate[x == args[]].  And this appears to work.  If you do ?f, then
> you see a function comprising a number of conditional definitions.
> However, if you come to use the function, then it appears that
> Mathematica does not perform the condition test that appears in the
> definition!  It simply uses the first definition it finds.
>
> What is going on?!  How can I make this work?
>
> I attach a notebook with example code. [Contact Paul to
> get this notebook - Moderator]
>
> Many thanks for any help.
>
> Paul

ZZ

```

• Prev by Date: Re: Efficient Replacement Rules to Matrix?
• Next by Date: RE: Making a function dynamically define another conditional function...
• Previous by thread: Re: Making a function dynamically define another conditional function...
• Next by thread: RE: Making a function dynamically define another conditional function...