# Extracting argument sequences from function expressions

Why is it that

fun[x, y] /. fun[z__] :> z


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?

-
I thought it was related to the attribute OneIdentity (or Flat) of Dot but I can't reproduce the behaviour using a custom head that has these attributes set. – Szabolcs Jan 24 '14 at 19:04
Yeah, I thought it was that too. But it turned out not to be. – QuantumDot Jan 24 '14 at 19:04
– Mr.Wizard Jan 24 '14 at 19:48

The problem is that Dot[z__] is evaluated to z__

The solution:

 Dot[x, y] /. HoldPattern[Dot[z__]] :> z


Sequence[x, y]

-
Alternatives: Dot[x, y] /. Verbatim[Dot][z__] :> z and Dot[x, y] /. (p : Dot)[z__] :> z – Mr.Wizard Jan 25 '14 at 1: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] *)

-
This is a good alternative. Be aware that there is an evaluation difference that affects held expressions, e.g.: 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
@Mr.Wizard. Thanks, that's an interesting example and I guess one can always use Trott-Strzebonski to save the day Hold[{Dot[x, y]}] /. z_Dot :> With[{s = q[Sequence @@ z]}, s /; True] – RunnyKine Jan 26 '14 at 23:13
That is yet another evaluation sequence because you are inducing evaluation where there otherwise would be none. As a counterexample consider: 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 4:09