Re: Block vs. Module

*To*: mathgroup at smc.vnet.net*Subject*: [mg15692] Re: Block vs. Module*From*: "Allan Hayes" <hay at haystack.demon.co.uk>*Date*: Mon, 1 Feb 1999 14:54:12 -0500 (EST)*References*: <78umac$982@smc.vnet.net>*Sender*: owner-wri-mathgroup at wolfram.com

Fred Simons wrote in message <78umac$982 at smc.vnet.net>... >Eckhard, > >When using Block, there might be an interaction between the local >variables defined in Block and the variables you use yourself. Have a >look at the following example: > > In[1]:= f[x_] := Block[ {i}, Sum[x^i, {i, 1, 5} ]] > >In[2]:= f[a] > >Out[2]= \!\(a + a\^2 + a\^3 + a\^4 + a\^5\) > >In[3]:= f[i] > >Out[3]= 3413 > >In this situation I would like to see a polynomial in i instead of a >number. With Module, this cannot happen because Module creates names >for the local variables that the user is supposed not to use: > >In[4]:= g[x_] := Module[ {i}, Sum[x^i, {i, 1, 5} ]] > >In[5]:= g[a] > >Out[5]= \!\(a + a\^2 + a\^3 + a\^4 + a\^5\) > >In[6]:= g[i] > >Out[6]= \!\(i + i\^2 + i\^3 + i\^4 + i\^5\) > >If you are only interested in variables that have numerical values, you >can safely use Block instead of Module. > >Hope this helps, > > >Fred Simons >Eindhoven University of Technology Fred It might be useful to analyse the evaluation of the Module version - it is scoping that does the trick: After g[x_] := Module[ {i}, Sum[x^i, {i, 1, 5} ]] The first step in the evaluation of g[i]. should apparently generate the result of replacing x inside Module[...] by i; that is Module[ {i}, Sum[i^i, {i, 1, 5} ]] which would not be what we want. But because Module is a scoping construct, and in the the original Module[...] the i in {i} is bound to the i in x^i, the replacement of the x triggers a change of the original i's to i$, so that we get Module[ {i$}, Sum[i^i$, {i, 1, 5} ]] Then Module replaces i$ in Sum[...] with i&n (where n is the current vale of $ModuleNumber) and gives Sum[i^i$n, {i, 1, 5} ]] which then evaluates. We can see this by using TracePrint[g[i]]. We can use scoping alone (in a contrived way!) Clear[g,a] g[x_] :=( i_->Sum[x^i,{i,2}])[[2]] g[a] a + a^2 g[i] i + i^2 The first step in evaluating g[i], including scoping, gives ( i$_->Sum[i^i$,{i$,2}])[[2]] Allan --------------------- Allan Hayes Mathematica Training and Consulting www.haystack.demon.co.uk hay at haystack.demon.co.uk Voice: +44 (0)116 271 4198 Fax: +44 (0)870 164 0565