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