Re: Evaluate/Module[Correction]
- To: mathgroup at smc.vnet.net
- Subject: [mg16145] Re: Evaluate/Module[Correction]
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Sat, 27 Feb 1999 03:23:11 -0500
- Sender: owner-wri-mathgroup at wolfram.com
Bernd Brandt has emailed me that he does not get the result that made me think that I had got the evaluation of CompoundExpression wrong. On re-evaluating the example I don't either -- there is a typo in my posting which may be related. I give variant of the example (In[1], below). This supports the original account, which with apologies to all, I now revert to: Normally, CompoundExpression evaluates its entries in order and then gives the value of the last one. However, it has the attribute HoldAll, and if some entries are wrapped in Evaluate[ ] they will be evaluated first, in order, *and* 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[1]:= pr=.; In[2]:= CompoundExpression[ { Print[2], pr = Print }, Evaluate[ {Print[1], pr[3]} ], pr[4] ] 1 2 3 4 The 3 comes from the second evaluatio of the second entry Bernd also asked in his email about the following result In[3]:= t=x^2+1; Module[{x=4}, Evaluate[t=t-1;Print[t]; Evaluate[t]]] \!\(x\^2\) Out[3]= 17 The evaluation steps for this (with M for Module, Pr for Print) are: The outer Evaluate cancels the HoldAll attribute of Module and the CompoundExpression t=t-1;Print[t]; Evaluate[t]] then evaluates , starting with the last entry: M[{x=4}, t=t-1;Pr[t]; x^2+1] M[{x=4}, t=x^2+1-1;Pr[t]; x^2+1] M[{x=4}, t=x^2;Pr[t]; x^2+1 ] M[{x=4}, x^2;Pr[t]; x^2+1 ] (t=x^2 stored) M[{x=4}, x^2;Null; x^2+1 ], x^2 printed M[{x=4}, x^2+1 ] Compound Expression has now been evaluated Module now evaluates Module[{x$n=4}, x$n^2+1 ], x$n^2+1 , (x$n=4 stored) 4^2 +1 17 (output) This reversion to the orignal description of the evaluation of CompoundExpression necessitates a change to my account in the previous posting of the evaluation of one of Paul Abbot's examples: In[1]:= a = 1; a = a - 1; Evaluate[a] Out[1]= 0 Evaluation steps (with CE for CompoundExpression) CE[a = 1, a = a - 1, a] CE[1, a = a - 1, a] (a =1 stored) CE[1, a = 1- 1, a ] ,, CE[1, a = 0, a ] ,, CE[1, 0, a ] (a=0 stored) CE[1, 0, 0 ] ,, 0 Previously the last two lines were a ,, 0 --------------------- 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