Re: Making a function dynamically define another conditional function...
- To: mathgroup at smc.vnet.net
- Subject: [mg21761] Re: [mg21733] Making a function dynamically define another conditional function...
- From: Hartmut Wolf <hwolf at debis.com>
- Date: Thu, 27 Jan 2000 22:56:42 -0500 (EST)
- Organization: debis Systemhaus
- References: <200001260845.DAA02315@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Paul Howland schrieb: > > 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? > Hello Paul, in your definitions above you seem to define function values only for certain discrete arguments, so I understand your function to be equivalent with f[A] = A+a f[B] = B+b etc. For that just do In[25]:= Apply[(f[#2] = #1 + #2) &, {{1, 2}, {3, 4}, {5, 6}}, {1}]; In[26]:= Information["f", LongForm -> False] "Global`f" f[2] = 3 f[4] = 7 f[6] = 11 To make up another example, and to fully show the metaprogramming method, e.g. if you want to have ff[x_] := a /; x <= A ff[x_] := b /; x <= B etc. In[35]:= makeFun[f_Symbol, data_] := (Apply[(f[x_] := #1 /; x <= #2) &, data, {1}]) In(36]:= makeFun[ff, {{1, 2}, {3, 4}, {5, 6}}]; In[37]:= Information["ff", LongForm -> False] "Global`ff" ff[x_] := 1 /; x <= 2 ff[x_] := 3 /; x <= 4 ff[x_] := 5 /; x <= 6 Regard that parentheses enclosing Set or SetDelayed in the defining functions are neccessary. Kind Regards, Hartmut
- References:
- Making a function dynamically define another conditional function...
- From: Paul Howland <paul.howland@nc3a.nato.int>
- Making a function dynamically define another conditional function...