Re: Module inside Module. Conflict between inner Module local variable
- To: mathgroup at smc.vnet.net
- Subject: [mg79591] Re: Module inside Module. Conflict between inner Module local variable
- From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
- Date: Mon, 30 Jul 2007 06:46:52 -0400 (EDT)
- References: <f8h4k8$6s5$1@smc.vnet.net>
Hi, your function definition is translated into an replacement rule DownValues[foo] gives {HoldPattern[foo[i_]] :> Module[{}, boo[] := Module[{i = 1}, Print[i]; ]; boo[]; ]} when foo[5] is evaluated, the pattern i_ is bound to 5 and all occurrences of i in the right hand side of the rule are replaced by i -> 5 and so you run into trouble because the definition of boo[] is now Module[{5=1}..] and that is clearly nonsense. And you definion is not allowed, because the right hand side must be evaluated when the pattern i is already bound to 5. Regards Jens Nasser Abbasi wrote: > This Mathematica 6.0.1 > > I just found out that I can't declare a local variable inside a Module > to be the same name as an input parameter for the outer module. > > foo[i_] := Module[{}, > > boo[] := Module[{i = 1}, > Print[i]; > ]; > > boo[]; > ] > > It seems an inner Module is being treated on the same level as the > outer module as far are variable scope is concerned. When I call > foo[5] for example, the local variable 'i' for boo[] was set to 5, > when it was supposed to be LOCAL to boo[] ! It looks like local > variables to inner modules are treated just like they are local > variables to the outer module. > > I understand that one can't make a local variable with the same name > as the argument, but boo[] above is supposed to be a separate module > (even though it is an inner module) except its scope is limited to > inside foo[]. > > So I do not see why the above would not be allowed. This restriction > does not seem to make too much sense to me. > > Is there a trick to make the above legal without moving boo[] outside > of foo[] ? > > thanks, > Nasser > >