Re: ReplaceAll question
- To: mathgroup at smc.vnet.net
- Subject: [mg82527] Re: ReplaceAll question
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Wed, 24 Oct 2007 04:19:06 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <ffkf46$sh6$1@smc.vnet.net>
Yaroslav Bulatov wrote:
> b = 3;
> Hold[a[[b]]] /. {b -> c}
>
> ReplaceAll has no effect, why? What is the recommended way of carrying
> out the replacement above?
After evaluation, you have Hold(a[[b]]] on the the LHS (the symbol 'b'
has not been replaced by its value since the function Hold has been
precisely designed to prevent it), whereas on the RHS the transformation
rule has been evaluated to {3 -> c}. So the replacement operator cannot
find any match between the LHS and the RHS, and consequently do nothing.
In[1]:= b = 3;
Hold[a[[b]]] /. {b -> c} // Trace
Out[2]= {{{{b, 3}, 3 -> c, 3 -> c}, {3 -> c}}, Hold[a[[b]]] /. {3 -> c},
Hold[a[[b]]]}
ReleaseHold seems to be the most appropriate choice to carry out the
replacement.
In[3]:= b = 3;
Hold[a[[b]]] /. {b -> c} // ReleaseHold
During evaluation of In[3]:= Part::partd: Part specification a[[3]] \
is longer than depth of object. >>
Out[4]= a[[3]]
Regards,
--
Jean-Marc