MathGroup Archive 2000

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

Search the Archive

Making a function dynamically define another conditional function...

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

So, the obvious solution is to define a function as follows:

In[1] := TestFn[data_List] := Module[{args},
                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]

Many thanks for any help.


  • Prev by Date: Re: Mathematica on the Web
  • Next by Date: Re: DSolve problems with system of ODEs. Out in pure notation?
  • Previous by thread: Re: Could this be improved?
  • Next by thread: Re: Making a function dynamically define another conditional function...