Re: Putting an expression into a module
- To: mathgroup at smc.vnet.net
- Subject: [mg84902] Re: Putting an expression into a module
- From: Albert Retey <awnl at arcor.net>
- Date: Fri, 18 Jan 2008 05:52:27 -0500 (EST)
- References: <fmngh8$3fl$1@smc.vnet.net>
Hi, > Suppose you have generated a long symbolic expression, e, and now wish > to use the expression inside a Module. One method would be to cut-and- > paste the expression into the Module but how do you do this without > cutting-and-pasting? > Below in a warm up problem I first get what I want by cutting-and- > pasting and then try various combinations of Hold, ReleaseHold and > Evaluate. These don't work (why?) but how can it be done? Usually my prefered way to insert evaluated expressions into a held expression is using by using With: In[24]:= e = y^2 - x^2 Out[24]= -x^2 + y^2 In[25]:= With[{expr = e}, ClearAll[f]; f[x_] := Module[{y}, y /. FindRoot[expr, {y, 1}]] ] In[26]:= DownValues[f] Out[26]= {HoldPattern[f[x$_]] :> Module[{y$}, y$ /.FindRoot[-x^2 + y^2, {y$, 1}]]} Note that this kind of works but of course messes up the scoping in this case. This is why in situations like that another thing I have made good experience with is to use functions instead of expressions, like here: In[36]:= With[{fun = Function @@ {{x, y}, e}}, ClearAll[f]; f[x_] := Module[{y}, y /. FindRoot[fun[x, y], {y, 1}]] ] As you can see from this, this works without any other workarounds to avoid problems with the scoping constructs: In[38]:= DownValues[f] Out[38]= {HoldPattern[f[x$_]] :> Module[{y$}, y$ /.FindRoot[Function[{x, y}, -x^2 + y^2][x$, y$], {y$, 1}]]} hth, albert