Services & Resources / Wolfram Forums
MathGroup Archive
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2005

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: MapAt changes its response towards different expressions

  • To: mathgroup at
  • Subject: [mg55523] Re: MapAt changes its response towards different expressions
  • From: Maxim <ab_def at>
  • Date: Sun, 27 Mar 2005 02:43:24 -0500 (EST)
  • References: <d20qme$b7f$>
  • Sender: owner-wri-mathgroup at

On Fri, 25 Mar 2005 10:55:10 +0000 (UTC), Jacco van Beek  
<jabe at> wrote:

> I have noticed that when I use MapAt to evaluate similar expressions of
> form MapAt[Evaluate, Hold[Expression], Coordinates] that Mathematica
> (version 5.1, Solaris) somehow executes these differently. The following
> example from below demonstrates the problem:
> I have defined a function MXP that produces an output statement and
> furthermore returns the input expression. I also define three similar
> expressions TRS which are all on Hold and which are of form
> Hold[a*MXP[b]+c], where a, b and c are either numbers or expressions.  I
> replace all occurences of Times in the TRS expressions by a temporary
> function TempTimes, which is not defined. Then I locate the position of
> the TempTimes within the TRS expressions, and use this as coordinates
> for the MapAt function. The following example shows a different
> execution in the second example even though the expression is very
> similar to the other two. Somehow, in the second example the call to MXP
> is evaluated, thus causing the output "Hello", and an error in my real
> application of a similar construct.
> Is this normal behaviour or is this a bug? It's easily solved by adding
> a 0 to all terms but I'd like to know what's causing this.
> Jacco van Beek
> ETH Zuerich
> Sample code:
> $Pre=.;
> MXP[xxx_] := Module[{}, Print["Hello"]; Return[xxx]];
> TRS = Hold[MXP[SPR[1,x]SPR[2,y]]]//.{Times :> TempTimes}
> Position[TRS, _TempTimes]
> MapAt[Evaluate, TRS, Position[TRS, _TempTimes]]
> Out[47]= Hold[MXP[TempTimes[SPR[1,x],SPR[2,y]]]]
> Out[48]= {{1,1}}
> Out[49]= Hold[MXP[Evaluate[TempTimes[SPR[1,x],SPR[2,y]]]]]
> TRS = Hold[3*MXP[SPR[1,x]SPR[2,y]]]//.{Times :> TempTimes}
> Position[TRS, _TempTimes]
> MapAt[Evaluate, TRS, Position[TRS, _TempTimes]]
> Out[50]= Hold[TempTimes[3,MXP[TempTimes[SPR[1,x],SPR[2,y]]]]]
> Out[51]= {{1,2,1},{1}}
> From In[50]:= Hello
> Out[52]= Hold[TempTimes[3,TempTimes[SPR[1,x],SPR[2,y]]]]
> TRS = Hold[3*MXP[SPR[1,x]SPR[2,y]]+0]//.{Times :> TempTimes}
> Position[TRS, _TempTimes]
> MapAt[Evaluate, TRS, Position[TRS, _TempTimes]]
> Out[53]= Hold[TempTimes[3,MXP[TempTimes[SPR[1,x],SPR[2,y]]]]+0]
> Out[54]= {{1,1,2,1},{1,1}}
> Out[55]=
> Hold[Evaluate[TempTimes[3,MXP[Evaluate[TempTimes[SPR[1,x],SPR[2,y]]]]]]+0]

Essentially your question is why Evaluate in Hold[Evaluate[f[x]]] and  
Hold[f[Evaluate[x]]] works differently. See for an  
explanation. And when you change TempTimes[a, b] to TempTimes[a, b] + 0  
you push TempTimes one level deeper.

Maxim Rytin
m.r at

  • Prev by Date: Re: Re: Bug in Import?
  • Next by Date: Re: Hypergeometric integral looks wrong ?
  • Previous by thread: MapAt changes its response towards different expressions
  • Next by thread: Re: Re: using Mathematica to plot in visual studio