Re: Is this a bug?
- To: mathgroup at smc.vnet.net
- Subject: [mg13439] Re: Is this a bug?
- From: "Allan Hayes" <hay at haystack.demon.cc.uk>
- Date: Fri, 24 Jul 1998 01:45:29 -0400
- References: <6p6oa9$56m@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
jfreeze at lexmark.com wrote in message <6p6oa9$56m at smc.vnet.net>... > >The following seems to be a bug. In the first example, both the true and >the false parts of If are being evaluated. In the secon example, only >the true part. If this is not a bug, could someone please explain this >behavior to me. Thanks > >In[1]:= > Clear[x,y]; > >If[True,Evaluate[ToExpression["x=5"]],Evaluate[ToExpression["y=5"]]]; > Print[x,y]; >Out[1]:= > 55 >In[2]:= > Clear[x,y]; > If[True,x=5,y=5]; > Print[x,y]; >Out[2]:= > 5y > This is not a bug. To try and explain the evaluation I will modify your example slightly to (1) In[1]:= Clear[x,y]; In[2]:= If[True,x=5,y=7] Out[2]= 5 In[3]:= {x,y} Out[3]= {5,y} (2) In[4]:= Clear[x,y]; In[5]:= If[True,Evaluate[x=5],Evaluate[y=7]] Out[5]= 5 In[6]:= {x,y} Out[6]= {5,7} Notice that the If has the attrribute HoldRest Here is what happens (1) For If[True,x=5,y=7] The *attribute* Hold Rest for If prevents evaluation of x=5 and x=7; so we get If[True,x=5,y=7] The *rules* for If are now used and give x=5 This is evaluated to ouput 5 and the rule x = 5 is stored Because of the stored rule {x,y} gives {5, y} (2) For If[True,Evaluate[x=5],Evaluate[x=7]] The *attribute* Hold Rest is overidden at Evaluate[x=5] which evaluates to 5 and stores x =5; similarly for Evaluate[y=7]; so we get If[True, 5 , 7 ] and the rules x = 5 and y = 7 have been stored The *rules* for If are now used and give 5 Because of the stored rule {x,y} gives {5, 7} You can see thes stages displayed by using TracePrint Clear[x,y]; If[True,x=5,y=7]//TracePrint Clear[x,y]; If[True,Evaluate[x=5],Evaluate[y=7]]//TracePrint ------------------------------------------------------------- Allan Hayes Training and Consulting Leicester UK http://www.haystack.demon.co.uk hay at haystack.demon.co.uk voice: +44 (0)116 271 4198 fax: +44(0)116 271 8642