Re: Variables Within Homemade Functions
- To: mathgroup at smc.vnet.net
- Subject: [mg69598] Re: Variables Within Homemade Functions
- From: dimmechan at yahoo.com
- Date: Sun, 17 Sep 2006 06:57:12 -0400 (EDT)
- References: <eegb90$lm$1@smc.vnet.net>
***You can use Module or Block. **Some simple examples will demonstrate their usage. ***I have converted the Outs in InputForm Quit Map[Information[#]&,{Module,Block}]; Module[{x, y, ... }, expr] specifies that occurrences of the symbols x, y, ... in expr should be treated as local. Module[{x = x0, ... }, expr] defines initial values for x, ... . InputForm[Attributes[Module] = {HoldAll, Protected}] Block[{x, y, ... }, expr] specifies that expr is to be evaluated with local values for the symbols x, y, ... . Block[{x = x0, ... }, expr] defines initial local values for x, ... . InputForm[Attributes[Block] = {HoldAll, Protected}] ***First notice that t=17; myfunction[x_]:=(t=a;x+c+t) myfunction[b] a + b + c FullDefinition[myfunction] myfunction[x_] := (t = a; x + c + t) t = a Information[t] Global`t InputForm[t = a] ***So the variable t take the new value a inside the definition of myfunction[]. ***Here is how you solve the problem. Clear["Global`*"] t=17; myfunction[x_]:=Module[{t=a},x+c+t] myfunction[b] a + b + c FullDefinition[myfunction] myfunction[x_] := Module[{t = a}, x + c + t] t = 17 Information[t] Global`t InputForm[t = 17] ***Hence using Module the global variable t keeps being equal to 17, how you wish. ***Another alternative is to use Block. Clear["Global`*"] t=17; myfunction[x_]:=Block[{t=d},x+c+t] myfunction[b] b + c + d FullDefinition[myfunction] myfunction[x_] := Block[{t = d}, x + c + t] t = 17 Information[t] Global`t InputForm[t = 17] ***However there is a big difference between Block and Module. Clear["Global`*"] t=17; myfunction[x_]:=Module[{t},x+c+t] myfunction[b] b + c + t$17 Information[t] Global`t InputForm[t = 17] ***The variable t$17 is the local variable used inside the Module. ***On the contrary Clear["Global`*"] t=17; myfunction[x_]:=Block[{t},x+c+t] myfunction[b] 17 + b + c FullDefinition[myfunction] myfunction[x_] := Block[{t}, x + c + t] t = 17 Information[t] Global`t InputForm[t = 17] ***I.e. if you do not assign a value for t inside the Block, Block will make usage of the global value of t. ***BTW, Block can have amazing results. For example Integrate[1/x, {x, -1, 2}] 1 Integrate::idiv: Integral of - does not converge on {-1, 2}. More... x Integrate[x^(-1), {x, -1, 2}] ***But Block[{Message},Integrate[1/x,{x,-1,2}]] Infinity ***Also Block[{$DisplayFunction = Identity}, g1 = Plot[UnitStep[x - 1], {x, 0, 1}]; g2 = Plot[UnitStep[x - 1], {x, 1, 2}]]; Show[g1, g2, Axes -> False, Frame -> True]; ***Otherwise you get a buggy vertical line connecting the points a x=1. ***Finally {x/x,x+x} {1, 2*x} ***but Block[{Plus},Apply[HoldForm,Apply[List,HoldForm[{x/x,x+x}]]]]//StandardForm {1,x+x} ***You can see more applications of Block as well a lot of information for other Built-In functions of Mathematica in the amazing link http://www.verbeia.com/mathematica/tips/Tricks.html (owned by Ted Ersek). ***Of course you should consult first the Mathematica Book! Regards Dimitris Anagnostou
- Follow-Ups:
- Re: Re: Variables Within Homemade Functions
- From: Daniel Lichtblau <danl@wolfram.com>
- Re: Re: Variables Within Homemade Functions