MathGroup Archive 2010

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

Search the Archive

Re: Re: ReplaceAll reloaded

  • To: mathgroup at smc.vnet.net
  • Subject: [mg107407] Re: [mg107397] Re: [mg107363] ReplaceAll reloaded
  • From: Leonid Shifrin <lshifr at gmail.com>
  • Date: Thu, 11 Feb 2010 08:33:24 -0500 (EST)
  • References: <hkeb04$t7v$1@smc.vnet.net> <4B6AB3AA.1080805@gmail.com>

Hi,

Thanks, I am well  aware of the solution. For some reason, my post was cut and only the upper half appeared. I repeat it here:

n[3]:= Or[a,b]/.Or[x__]:>{x}//Trace

Out[3]= {{{Or[x__],x__},x__:>{x},x__:>
{x}},a||b/.x__:>{x},{a||b}}

<Or> on your pattern evaluates to the pattern itself before the match is
attempted. This is due
to the behavior of Or on any single argument - it just returns the argument.
To avoid this, you have
to prevent the  evaluation of your rule's l.h.s. Either use HoldPattern:

In[4]:= Or[a,b]/.HoldPattern[Or[x__]]:>{x}

Out[4]= {a,b}

Or Verbatim

In[5]:= Or[a,b]/.Verbatim[Or][x__]:>{x}

Out[5]= {a,b}

or, possibly, wrap the entire rule in Unevaluated:

In[8]:= Or[a, b] /. Unevaluated[Or[x__] :> {x}]

Out[8]= {a, b}


Regards,
Leonid




On Thu, Feb 11, 2010 at 3:50 PM, <bsyehuda at gmail.com> wrote:

> you need to prevent the evaluation of Or on a single argument
>
> Or[x] returns x
> so in the rhs of the replacement rule Or[y__] returns y__
> so the rule itself is identical to Or[a,b] /. y__:> {y}
> and the result is clear
> two way to solve it
>
> Or[a,b]/.Or[x_,y_]:>{x,y}
> or possibly (for more than 2 variables)
> Or[a,b]/.Or[x_,y__]:>{x,y}
>
> but this is tedious and not a general solution
> the way to do it is to prevent the evaluation of the rhs, using HoldPattern
>
> Or[a,b]/.HoldPattern[Or[y__]]:>{y}
> and this returns {a,b}
> as required
>
> yehuda
>
>
> On Thu, Feb 11, 2010 at 2:08 PM, Leonid Shifrin <lshifr at gmail.com> wrote:
>
>> Istvan,
>>
>> all you need is to run Trace - it shows pretty clearly what happens:
>>
>> In[3]:= Or[a,b]/.Or[x__]:>{x}//Trace
>>
>> Out[3]= {{{Or[x__],x__},x__:>{x},x__:>{x}},a||b/.x__:>{x},{a||b}}
>>
>> <Or> on your pattern evaluates to the pattern itself before the match is
>> attempted. This is due
>> to the behavior of Or on any single argument - it just returns the
>> argument=
>>
>
>


  • Prev by Date: Re: hi, how can i accomplish this densityplot?
  • Next by Date: Re: Rotating graphics problem
  • Previous by thread: Re: Re: ReplaceAll reloaded
  • Next by thread: Re: ReplaceAll reloaded