I think my answer to Why does this pattern with Plus not work for numbers?Why does this pattern with Plus not work for numbers? is also the answer here.
See Plus in the reference manual:
Unlike other functions, Plus applies built-in rules before user-defined ones. As a result, it is not possible to make definitions such as
2+2=5
.
The ability for user-defined rules to supersede built-in ones was lost in Version 3.
There is a similar property for Times
.
Here is some evidence that rules for Plus
are applied internally even when Plus
is blocked:
Block[{Plus}, 1 + 2*2 /. Plus -> List]
(* 5 *)
p[x__] := Plus[x];
Block[{p}, p[1, 2*2] /. p -> List]
(* {1, 4} *)
Update -- some more evidence:
Block[{Plus},
Hold[1 + 2*2] /. x_Plus :> With[{r = x}, r /; True]] // Trace
Block[{p},
Hold[p[1, 2*2]] /. x_p :> With[{r = x}, r /; True]] // Trace