Why is it that
fun[x, y] /. fun[z__] :> z
leads to
Sequence[x,y]
but
Dot[x, y] /. Dot[z__] :> z
gives
Dot[x,y]
I want it to be
Sequence[x,y]
Makes no sense. How do I make it work like I think it should?
Why is it that
fun[x, y] /. fun[z__] :> z
leads to
Sequence[x,y]
but
Dot[x, y] /. Dot[z__] :> z
gives
Dot[x,y]
I want it to be
Sequence[x,y]
Makes no sense. How do I make it work like I think it should?
The problem is that Dot[z__] is evaluated to z__
The solution:
Dot[x, y] /. HoldPattern[Dot[z__]] :> z
Sequence[x, y]
Dot[x, y] /. Verbatim[Dot][z__] :> z and Dot[x, y] /. (p : Dot)[z__] :> z
– Mr.Wizard
Jan 25 '14 at 01:06
While this doesn't explain the behavior you notice (andre's answer does) and all the right methods have been covered here (See Mr.Wizard's alternatives), I found a nice work-around that will work with any Head (replace Dot with your Head of choice). Here it is:
Dot[x, y] /. z_Dot :> Sequence @@ z
(* Sequence[x, y] *)
Hold[{Dot[x, y]}] /. z_Dot :> q[Sequence @@ z] (or more simply z_Dot :> q @@ z) versus Hold[{Dot[x, y]}] /. Verbatim[Dot][z__] :> q[z]
– Mr.Wizard
Jan 26 '14 at 22:53
Hold[{Dot[x, y]}] /. z_Dot :> With[{s = q[Sequence @@ z]}, s /; True]
– RunnyKine
Jan 26 '14 at 23:13
Hold[{Dot[1, 2]}] /. Verbatim[Dot][z__] :> +z. I think you will find this hard to do in a single step using z_Dot :> . . .; in fact if you can I want to know about it because I can't think of a solution.
– Mr.Wizard
Jan 27 '14 at 04:09
OneIdentity(orFlat) ofDotbut I can't reproduce the behaviour using a custom head that has these attributes set. – Szabolcs Jan 24 '14 at 19:04