Re: Replace unevaluated symbols
- To: mathgroup at smc.vnet.net
- Subject: [mg118871] Re: Replace unevaluated symbols
- From: David Reiss <dbreiss at gmail.com>
- Date: Sat, 14 May 2011 03:05:28 -0400 (EDT)
- References: <iqj160$rh8$1@smc.vnet.net>
The reason why this happens can be gleaned by Tracing an example:
z = 0;
THen
TracePrint[
Hold[z] /. z -> 7
]
gives
Hold[z]/. z->7
ReplaceAll
Hold[z]
Hold
z->7
Rule
z
0
7
0->7
0->7
Rule
0
7
Hold[z]/. 0->7
Hold[z]
>From this you can see that the replacement rule z->7 is evaluated to 0-
>7 and hence the result is correct. This is all a consequence of
Mathematica's standard evaluation process.
So indeed an approach using Block or Module for example allows you to
by pass this:
Block[{z},
TracePrint[
Hold[z] /. z -> 7
]
]
gives
Hold[z]/. z->7
ReplaceAll
Hold[z]
Hold
z->7
Rule
z
7
z->7
Rule
z
7
Hold[z]/. z->7
Hold[7]
Hold
In essence, if you wish to bypass Mathematica's standard evaluation
order, you will need to localize the variable as you suggest.
Best,
David
On May 13, 6:29 am, Antonio De Ju=E1rez <adejua... at gmail.com> wrote:
> Given an expression like
>
> {x+y,2*x-y}
>
> I would like to replace x and y with some values even if these
> variables have some value assigned. For example, the code
>
> expr = Hold[x+y,2x-y]
> expr/.x->3
>
> produces
>
> Hold[3 + y, 2*3 - y]
>
> but the code
>
> x=2.5;
> expr = Hold[x+y,2x-y]
> expr/.x->3
>
> produces the wrong result
>
> Hold[x + y, 2 x - y]
>
> I know this can be done using Block; however, I don't know the
> variables to be replaced beforehand. I would like to have a function
> with attribute HoldAll like
>
> fun[expr,var1,value1,var2,value2,...]
>
> that replaces the variables var1, var2, ... by the corresponding
> values value1, value2,..., even if any of the variables var1, var2,...
> has a preassigned value.