Re: Mathematica language issues
- To: mathgroup at smc.vnet.net
- Subject: [mg52971] Re: Mathematica language issues
- From: Oliver Ruebenkoenig <ruebenko at imtek.uni-freiburg.de>
- Date: Sat, 18 Dec 2004 03:59:47 -0500 (EST)
- Organization: Rechenzentrum der Universitaet Freiburg, Germany
- References: <cpuilf$hd6$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Dear Maxim, > All the typical issues with the Mathematica programming language are > still present in version 5.1: > > Compile[{}, > Module[{x = 0}, > While[x++; EvenQ[x] ]; > x > ]][] Compile[{}, Module[{x = 0}, x++; While[EvenQ[x]]; x]][] x++; EvenQ[x] is CompoundExpression[ x++, EvenQ[ x ] ] While[ test ] needs a test not a CompoundExpression > > still evaluates to 3, and it is easy to construct other similar > examples: > [ ... ] > problems such as > > In[3]:= > Unevaluated[D[y, x]] /. {y -> x} > Unevaluated[D[y, x]] /. {{y -> x}} > > Out[3]= > 1 > > Out[4]= > {0} > > where you can find out how many Unevaluated wrappers are required in > each case only by trial and error, to curious glitches like Consider: In[1]:= Trace[ Unevaluated[D[y, x]] /. {y -> x} ] Out[1]= {D[y, x] /. {y -> x}, D[x, x], 1} and In[2]:= Trace[ Unevaluated[D[y, x]] /. {{y -> x}} ] Out[2]= {D[y, x] /. {{y -> x}}, {D[y, x] /. {y -> x}}, > {{D[y, x], 0}, 0 /. {y -> x}, 0}, {0}} but you must: In[3]:= Trace[ Unevaluated[ Unevaluated[D[y, x]] ] /. {{y -> x}} ] Out[3]= {Unevaluated[D[y, x]] /. {{y -> x}}, > {Unevaluated[D[y, x]] /. {y -> x}}, {D[y, x] /. {y -> x}, D[x, x], 1}, > {1}} and you should: In[4]:= ReleaseHold[ HoldPattern[D[y, x]] /. {{{{{{y -> x}}}}}} ] Out[4]= {{{{{1}}}}} > > In[5]:= > Unevaluated[1 + 1]*2 > 2*Unevaluated[1 + 1] > > Out[5]= > 4 > > Out[6]= > 2*Unevaluated[1 + 1] look at the evaluation order. In[5]:= Unevaluated[ 1 + 1 ]*2 // Trace Out[5]= {(1 + 1) 2, 2 (1 + 1), {1 + 1, 2}, 2 2, 4} and In[6]:= 2 * Unevaluated[ 1 + 1 ] // Trace Out[6]= {2 (1 + 1), 2 Unevaluated[1 + 1]} In the first case Unevaluated[ 1 + 1 ] is seen _twice_ by the evaluator. And since Unevaluated[ expr ] give expr unevaluated as an argument to Times and Times reorders its arguments it is seen twice. FullForm[ Unevaluated[ Unevaluated[ 1 + 1 ]*2 ] ] Unevaluated[Times[Unevaluated[Plus[1, 1]], 2]] Hope that helps, Oliver Oliver Ruebenkoenig, <ruebenko at imtek.de> Phone: ++49 +761 203 7385