8

I have a very simple question about redefining basic built-in functions, such as Plus. I'm pretty sure someone must have asked a similar question around here, but I couldn't find one. Consider the following code:

Unprotect[Plus];
x_ + y_ := x y
Protect[Plus];

For symbols this works as expected:

x+y
(* ---> x y *)

For numbers, however, the new definition does not work:

1+2
(* ---> 3 *)

Of course I know that it is stupid to use something like this and that defining functions or using upvalues etc. is the way to go here, but I'm really interested in why this happens. Can the pattern for Plus be defined in such a way that it works for numbers as well? Is Plus[1,2] evaluated internally before the pattern can be matched?

einbandi
  • 4,024
  • 1
  • 23
  • 39
  • 2
    And here is a very simple answer: don't do it. – Leonid Shifrin Feb 06 '13 at 00:04
  • Have you read the question? I'm not interested in workarounds or whether or not it's a good idea to do this (of course it isn't!). I thought mabye someone could explain to me what happens so I get a better understanding of what Mma does. – einbandi Feb 06 '13 at 00:07
  • 4
    IMO, this internal mechanics of Plus should not be relevant to the user. To me, this seems one of those internal details which can not serve you well even if you know them. Plus, Times and perhaps a few more fundamental functions have deviations from the standard evaluation semantics, so that certain buit-in rules like the one you illustrated apply before the user-defined rules. The whole fact that this was done in this way shows that those rules were considered very fundamental by developers, which brings the question again: how would the knowledge of exact semantics here be helpful? – Leonid Shifrin Feb 06 '13 at 00:13
  • 3
    Operations like Plus and Times are deeply wired in the system and cannot be modified beyond a certain point, as they're essential to pretty much everything else. For example, try: Unprotect@Plus; Remove@Plus; 1+1 Look ma! No Plus! But you still get 2. However Plus[1,1] remains unevaluated. – rm -rf Feb 06 '13 at 00:14
  • 1
    I somehow thought it was interesting to find out where this point, to which they can be modified is, no matter if this is useful or not. But now I'm thinking of deleting the question. The fundamental difference between how Plus works for numbers and symbols was just something that seemed strange to me. – einbandi Feb 06 '13 at 00:17
  • 2
    I think that this is a rather important detail, and perhaps having this question around would be nice, since people come back to this every now and then. Just a day ago there was a similar question on Mathgroup. It is just this kind of detail where pretty much all one can say is "you do want to know about the mere fact of it, but you don't want to know anything deeper than that". – Leonid Shifrin Feb 06 '13 at 00:21
  • No, I don't think you should delete this question. I personally think it would be good to have this answered, as I do not know the actual answer either, beyond what I've written. I've just never had a need to alter something as fundamental as Plus, but a comprehensive answer that also touches upon what might break if hypothetically one were to do this would be really great to have. – rm -rf Feb 06 '13 at 00:24
  • Okay, maybe someone can give some real insight into this at some point. At the very least, this will serve as a future reference. Maybe a post with some experiments and comparison between different functions and patterns, including what you said about the nature of such fundamental functions, will be enough to have this answered. – einbandi Feb 06 '13 at 00:32

1 Answers1

15

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

Michael E2
  • 235,386
  • 17
  • 334
  • 747