Re: Making a function dynamically define another conditional function...
- To: mathgroup at smc.vnet.net
- Subject: [mg21777] Re: [mg21733] Making a function dynamically define another conditional function...
- From: BobHanlon at aol.com
- Date: Thu, 27 Jan 2000 22:56:58 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Here is one approach:
Clear[f];
?f
"Global`f"
testList = {{a, A}, {b, B}, {1, 2}, {3, 4}, {5, 6}};
TestFn[data_List] :=
ToExpression[
"f[x_] := x+" <> ToString[#[[1]]] <> "/;x==" <> ToString[#[[2]]] & /@
data]
TestFn[testList];
?f
"Global`f"
f[x_] := x + a /; x == A
f[x_] := x + b /; x == B
f[x_] := x + 1 /; x == 2
f[x_] := x + 3 /; x == 4
f[x_] := x + 5 /; x == 6
f[#[[2]]] & /@ testList
{a + A, b + B, 3, 7, 11}
Bob Hanlon
In a message dated 1/26/2000 5:20:51 AM, paul.howland at nc3a.nato.int writes:
>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[1] := TestFn[data_List] := Module[{args},
> ClearAll[f];
> Do[
> args = data[[i]];
> f[x_] = x + args[[1]] /; x==args[[2]],
> {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[[2]] 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[[1]] /;
>Evaluate[x == args[[2]]]. 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]
>