[Date Index]
[Thread Index]
[Author Index]
Re: MapAt changes its response towards different expressions
*To*: mathgroup at smc.vnet.net
*Subject*: [mg55523] Re: MapAt changes its response towards different expressions
*From*: Maxim <ab_def at prontomail.com>
*Date*: Sun, 27 Mar 2005 02:43:24 -0500 (EST)
*References*: <d20qme$b7f$1@smc.vnet.net>
*Sender*: owner-wri-mathgroup at wolfram.com
On Fri, 25 Mar 2005 10:55:10 +0000 (UTC), Jacco van Beek
<jabe at nmr.phys.chem.ethz.ch> 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
http://forums.wolfram.com/mathgroup/archive/2005/Feb/msg00404.html 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 inbox.ru
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**
| |