MathGroup Archive 1999

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

Search the Archive

Re: Evaluate/Module

  • To: mathgroup at smc.vnet.net
  • Subject: [mg16079] Re: Evaluate/Module
  • From: "Allan Hayes" <hay at haystack.demon.co.uk>
  • Date: Thu, 25 Feb 1999 08:24:47 -0500
  • References: <7atq9s$7kr@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Bernd Brandt wrote in message <7atq9s$7kr at smc.vnet.net>...
>Hi,
>
>I'm having some trouble with Evaluate and i cannot find this in the
>documentation.
>Does anybody know what and esp. why the following is happening?
>
> In1:= tmp = x^2 +1;
>
> In2:= Module[{x=4},tmp=tmp-1;Print[tmp]; Evaluate[tmp]]
>
> x^2
> x^2 + 1
>
>In the above Evaluate[tmp] somehow takes the latest value of tmp and not
>the current one after the "tmp=tmp-1". Why?
>
>Changing "Evaluate[tmp] to "l=Evaluate[tmp]" does give the right answer
>(in this case x^2) immediately. Does this assignment force Evaluate to
>Evaluate tmp before ending the Module. Does someone know more about
>Evaluate and Modelule?
>
> lM[x0_]:= Module[{lonediff,lMdiff,ldead,lone,search},
> lonediff= 1 + lone/2 - x0/lone - 2 / (1 + Exp[2*ldead - 2*lone]);
> lMdiff = (2*(x0/(1+x0) )*E^(-ldead+ lone))/(E^(2*lone-2*ldead)+1)-
>0.1;
> search=FindRoot[{lMdiff==0, lonediff==0 },{ldead,x0+1} ,{lone,x0}];
> Evaluate[ldead /. search]
> ];
>
> lM[6]
>
> ReplaceAll::"reps":
>     {search$77} is neither a list of replacement rules nor a valid
> dispatch table, and so cannot be used for replacing."
>
> 5.44865
>
>In this module Evaluate somehow is looking for an global "search"
>variable.
>Why does it not just evaluate this local "search"?
>
>Thanks,
>
>Bernd
----------------------------------------------------------------------------
---------------------------------------

Neither problem invoves Module; both are due to how expressions like
    e1;e2;e3;e4        (FullForm CompoundExpression[e1,e2, e3,e4]
evaluate

Normally, CompoundExpression evaluates its entries in sequence and then
gives the value of the last one. However, since it has the attribute HoldAll
this evaluation is under the control of the programmer and if some entries
are wrapped in Evaluate[  ] they will be evaluated first *and* the the
resulting expression will then be evaluated as usual
So, writing  ei* for the value of ei, we get the following steps

CompoundExpression[e1, Evaluate[e2], Evaluate[e3], e4]
CompoundExpression[e1, e2*, Evaluate[e3], e4]
CompoundExpression[e1, e2*, e3*, e4]       (*restart!*)
CompoundExpression[e1*, e2*, e3*, e4]
CompoundExpression[e1*, e2**, e3*, e4]
CompoundExpression[e1*, e2**, e3**, e4]
CompoundExpression[e1*, e2**, e3**, e4*]
e4*

In your examples, simply deleting Evaluate will make them work as expected.

Incidentally, in your code

tmp = x^2 +1;

Module[{x=4}, tmp=tmp-1;Print[tmp]; Evaluate[tmp]]

Module has no effect:
- the x are renamed  x$n (where n is the ModuleNumber); but this is done
before the body
                tmp=tmp-1;Print[tmp]; Evaluate[tmp]
is evaluated, so, only the displayed x  is renamed.
- then the assigment  x$n = 4 is made.
- after this the body evaluates to x^2+1 but this involves x, not x$n, so
the assignment has no effect.

However, try wrapping Evaluate around the body....

Allan

---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565






  • Prev by Date: RE: Syntax error in notebook saved as package
  • Next by Date: help with pde
  • Previous by thread: Re: Evaluate/Module
  • Next by thread: Re: Evaluate/Module