Re: Funny Behavior of Module

*To*: mathgroup at smc.vnet.net*Subject*: [mg124747] Re: Funny Behavior of Module*From*: "Oleksandr Rasputinov" <oleksandr_rasputinov at ymail.com>*Date*: Sat, 4 Feb 2012 06:27:07 -0500 (EST)*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com*References*: <jgg195$bnb$1@smc.vnet.net>

On Fri, 03 Feb 2012 07:10:29 -0000, Louis Talman <talmanl at gmail.com> wrote: > I know that Module exhibits some funny behavior, but this behavior is > something I've never seen before. It seems wrong to me. > > In a new kernel session enter > > f[x_] := Module[{a},a = x^2; x = y; a] > > f[z] > > z > > Mathematica returns y for z, as it ought to. (In fact, the purpose of > the code was to demonstrate to students what can happen when a Module > monkeys with its formal parameters.) > > But f[z] returns y^2. It seems to me that it should return z^2, but that > for some reason it's interpreting the first Set instruction in the body > of the Module as a SetDelayed instruction. (We get exactly the same > behavior if we replace that Set with SetDelayed in the code.) > > Can anyone explain what's going on here? ITABOAF? > > > --Lou Talman > f[z] does return z^2, in a sense. However, after setting a = z^2 in the Module, z is immediately set to y. So, in the output, z is duly replaced with y and the result appears as y^2. I'm not too sure where the source of confusion lies but perhaps it will help to recall that in pattern-matched definitions such as f[x_] := (some function of x), the parameter is directly substituted into the function body where x appears. Here x does not exist as a symbol in its own right; it just acts as a placeholder for whatever was pattern-matched to x_. If you pass a symbol that can't be acted on by Set, x = y does not apply and you will get a different result: In := SetAttributes[q, Protected]; f[q] During evaluation of In := Set::wrsym: Symbol q is Protected. Out = q^2 So, neither bug nor feature, but simply a confusing example.