Re: Re: Re: Is this a bug?
- To: mathgroup at smc.vnet.net
- Subject: [mg13473] Re: [mg13445] Re: Re: Is this a bug?
- From: Carl Woll <carlw at fermi.phys.washington.edu>
- Date: Sun, 26 Jul 1998 02:33:34 -0400
- Sender: owner-wri-mathgroup at wolfram.com
Hi,
I still don't understand why you need to wrap your ToExpression with
Evaluate. What's wrong with
If[ test, ToExpression["valid statement"],
ToExpression["invalid statement"]]
Carl Woll
Dept of Physics
U of Washington
On Fri, 24 Jul 1998 jfreeze at lexmark.com wrote:
> Thanks for all of the responses. My original question was (basically)
> why does
> If[True, Evaluate[x=5], Evaluate[y=5]] give
> {x,y} as {5,5}.
> It was explained by several people that the reason is that Evaluate
> overides HoldRest.
> Nevertheless, it seems to me that expressions not returned from If
> should not be executed,
> regardless if Evaluate is used.
>
> One responder suggested that it was returning what I asked it to. Well,
> no, I did not ask
> it to execute a false expression. Consider the C statement if(condition)
> {
> // do if true
> }
> else
> {
> // do if false
> }
> Here, no matter what assignments to variables are made in "false", they
> are not
> made if condition == true. I guess some will say that here lies my real
> sin, thinking
> in C. : )
>
> Well, we could start a real good thread here about the
> evaluation/execution of
> all expressions in If regardless of the value of condition, which I am
> not opposed to,
> but, being a pragmatist at the moment, I am looking for a solution to
> the following
> (seeing that If will not work now):
>
> If[ test, Evaluate[ToExpression["valid statement"]],
> Evaluate[ToExpression["invalid statement"]]]
>
> What this statement does it to test for validity of a string before
> converting
> it to an expression.
> Since If executes all its arguments, regardless of test, can someone
> suggest a
> method accomplish this task?
> Thanks
> Jim Freeze
> jfreeze at lexmark.com
>
>
>
> "Allan Hayes" <hay%haystack.demon.cc.uk at interlock.lexmark.com> on
> 07/23/98 07:18:20 AM
>
> Please respond to "Allan Hayes"
> <hay%haystack.demon.co.uk at interlock.lexmark.com>
>
> cc:
> bcc:
> Subject: [mg13473] [mg13445] Re: Is this a bug?
>
>
>
> 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
>
>
>
>
>