Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2000
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

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: [mg21755] Re: Making a function dynamically define another conditional function...
  • From: "Allan Hayes" <hay at haystack.demon.co.uk>
  • Date: Thu, 27 Jan 2000 22:56:36 -0500 (EST)
  • References: <86md60$2cr@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Paul:
We need to get the values inside the assignments before evaluating them:

TestFn[data_List] := Module[{args},
ClearAll[f];
Do[
args = data[[i]];
(f[x_] = x + #1 /; x == #2) & @@ args,
{i, Length[data]}
]]


TestFn[{{a, A}, {b, B}}]


?f

    "Global`f"

    f[x_] = a + x /; x == A

    f[x_] = b + x /; x == B


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


"Paul Howland" <paul.howland at nc3a.nato.int> wrote in message
news:86md60$2cr at smc.vnet.net...
>
> 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]
>
> Many thanks for any help.
>
> Paul
>



  • Prev by Date: RE: Could this be improved?
  • Next by Date: RE: Simplifying Finite Sums With A Variable # of Terms
  • Previous by thread: Re: Making a function dynamically define another conditional function...
  • Next by thread: Re: Making a function dynamically define another conditional function...