Re: Is this a bug?
- To: mathgroup at smc.vnet.net
- Subject: [mg32096] Re: Is this a bug?
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Sun, 23 Dec 2001 03:52:35 -0500 (EST)
- References: <9vs8ph$g1d$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Paul, 1 Here is a version of Increment that seems to be close to the built in one, (follow the latter's evaluation with TracePrint, there is no evidence of the use of With in the built in function but the main evaluation steps are the same). Attributes[incr]={HoldFirst}; (*Increment is HoldFirst*) incr[x_]:= With[{t=x},x=t+1;t] Compare k[x_]:=Module[{},Print["hallo world"];x]; a[5]=a5; incr[a[k[5]]] hallo world hallo world a5 Explanation: Because of incr being HoldFirst the main steps in the evaluation of incr[a[k[5]]] are as follows With[{t=a[k[5]]},a[k[5]]=t+1;t] With[{t=a[5]},a[k[5]]=t+1;t] (*+ first print *) With[{t=a5},a[k[5]]=t+1;t] a[k[5]]=a5+1;a5 (*+ second print *) a[5] = a5+1; 2 Let's modify Random so that we get a printout of what the selections are ri:=(Print[#];#)&[ Random[Integer]] a[0]:=a0;a[1]:=a1; Do[ a[ri]++;Print[{a[0],a[1]}], {3} ]; 0 0 {1 + a0, a1} 0 1 {1 + a0, 2 + a0} 1 0 {3 + a0, 2 + a0} Following the code in 1 above successive evaluations of the body of Do[..] give the assignments a[0] = a[0]+1 = a0+1 a[1] = a[0]+1 = (a0+1) +1 = a0+2 a[0] = a[1]+1 = (a0+2)+1 = a0 The general situation is that an evaluation of the body that begins by giving the printouts i j will make the assignment a[j] = a[i] Here is another example a[0]:=a0;a[1]:=a1; Do[ a[ri]++;Print[{a[0],a[1]}], {3} ]; 0 1 {a0, 1 + a0} 0 1 {a0, 1 + a0} 0 1 {a0, 1 + a0} -- 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 "Paul van Wamelen" <wamelen at math.lsu.edu> wrote in message news:9vs8ph$g1d$1 at smc.vnet.net... > Is the following a bug? > > Mathematica 4.1 for Sun Solaris > Copyright 1988-2000 Wolfram Research, Inc. > -- Motif graphics initialized -- > > In[1]:= k[x_] := Module[{},Print["hallo world"];x]; > > In[2]:= a[5] = 0; > > In[3]:= a[k[5]]++ > hallo world > hallo world > > Out[3]= 0 > > > I would have expected only one "hallo world" and it would seem to be > more efficient to only evaluate the k[5] once... > > The above example is not important but in the form below it had me > baffled for a while: > > In[4]:= tst[n_] := Module[{a}, > a[0] = a[1] = 0; > Do[a[Random[Integer,{0,1}]]++,{n}]; > {a[0],a[1]}] > > In[5]:= tst[50] > > Out[5]= {24, 24} > > (Does not add up to 50!) > > Thanks! > > >