Re: Best practice passing expressions to functions

*To*: mathgroup at smc.vnet.net*Subject*: [mg85303] Re: Best practice passing expressions to functions*From*: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>*Date*: Tue, 5 Feb 2008 19:40:35 -0500 (EST)*Organization*: The Open University, Milton Keynes, UK*References*: <fo9gvu$t1l$1@smc.vnet.net>

Remo Aschwanden wrote: > I want to write procedures that accept expressions as parameters and be > able define functions based on these expressions, i.e. > > f[exp_]:=Module[ > "g[x_] := exp " > ] > > The code between the " " should clarify what I intend to do. Calling > f[x^2-2x+4] > should lead to the definition of a function (or pattern) > g[x_]:=x^2-2x+4; > > What's the best way to do this? How can I do this without being > dependent on the variables used in the expressions ("x")? One possible way, though I do not know whether it qualifies as best practice, is as follows. The first argument of f, exp_, is the expression that is going to be transformed into a function definition, function definition that depends on the variable var_, which is passed as second argument and as default value, say, x. The transformation rule applied to the pattern p_ looks for a pattern named p$ rather than p since Mathematica renames p_ as p$_ (you can see that by using the command *Trace*). In[1]:= f[exp_, var_: x] := g[p_ /. p$ -> var] := exp In[2]:= f[x^2 - 2 x y + 4 y] g[3] Out[3]= 9 - 2 y In[4]:= f[x^2 - 2 x y + 4 y, x] g[3] Out[5]= 9 - 2 y In[6]:= f[x^2 - 2 x y + 4 y, y] g[3] Out[7]= 12 - 6 x + x^2 Regards, -- Jean-Marc