MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Funny Behavior of Module

  • To: mathgroup at smc.vnet.net
  • Subject: [mg124770] Re: Funny Behavior of Module
  • From: "Nasser M. Abbasi" <nma at 12000.org>
  • Date: Sat, 4 Feb 2012 06:35:06 -0500 (EST)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • References: <jgg195$bnb$1@smc.vnet.net>
  • Reply-to: nma at 12000.org

On 2/3/2012 1:10 AM, Louis Talman 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
>    Department of Mathematical&  Computer Sciences
>    Metropolitan State College of Denver
>
>    <http://rowdy.mscd.edu/%7Etalmanl>
>

The program is not really a valid Mathematica code, inside
the function, the pattern x_ should always show up on the RHS
of any assignment, not on the LHS.
  
In your example this line

    x=y

is not valid, since the pattern x shows on the left side of
an assignment not on the right side.

As what happens when you wrote it the way you did:

a=x^2 ===> this becomes a=z^2 since x is z
next, you say x=y, which became z=y, since x is z.
next, the last thing you have is 'a'. Now Mathematica
will evaluate 'a', which is z^2. But now 'z' is 'y',
so it does one more transformation rule, Hence 'a' which is 'z^2'
evaluates to 'y^2'

And this is what you see.

This is no different than writing

------------------
Remove["Global`*"]
a=z^2;
z=y;
a
-------------------

and now you'll see that 'a' is y^2 and not z^2. Since
'a' evaluates 'a' to z^2, and 'z' evaluates to 'y^2',
and now the evaluator stops, since there is no more
transformation rules to apply.

One way to do what you did is by introducing a local symbol

-----------------------
Remove["Global`*"]
f[$x_] := Module[{a, x = $x}, a = x^2; x = y; a]
f[z]
--------------------------

now it returns  z^2. The reason the above returns z^2 and not
y^2, is because:

a=x^2 ===> this becomes a=z^2 since x is z
next, x=y, but now x is the local x and not z. So, x becomes y.
next, we have'a'. Now Mathematica will evaluate 'a', which is z^2,
and no more. z still is z. So what you get is z^2.

--Nasser



  • Prev by Date: Re: Problem using Solve or Nsolve
  • Next by Date: Re: PDE with RecurrenceTable
  • Previous by thread: Re: Funny Behavior of Module
  • Next by thread: Re: Funny Behavior of Module