MathGroup Archive 2000

[Date Index] [Thread Index] [Author Index]

Search the Archive

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]
>


  • Prev by Date: Re: Could this be improved?
  • Next by Date: RE: Could this be improved?
  • Previous by thread: Re: Making a function dynamically define another conditional function...
  • Next by thread: Re: Making a function dynamically define another conditional function...