Re: Foo /: Plus[b_Foo] := b
- To: mathgroup at smc.vnet.net
- Subject: [mg114564] Re: Foo /: Plus[b_Foo] := b
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Wed, 8 Dec 2010 06:39:32 -0500 (EST)
Hi kj, Now you have entered the forbidden territory :) Here is a very crude way to fix your example: ClearAttributes[Plus, OneIdentity] In[5]:= 1 + Foo[1] Out[5]= 1 + Foo[1] SetAttributes[Plus, OneIdentity] Have a look at attributes Flat and OneIdentity (they tend to be considered together, and for a good reason), both in the Help, and, even better, in some past Mathgroup discussions, for the explanation. But this is not for the faint-hearted :). The bottom line: your UpValue is not at all innocent, given the set of Arttributes of Plus. Hope this helps. Regards, Leonid On Tue, Dec 7, 2010 at 2:46 PM, kj <no.email at please.post> wrote: > An innocent-looking upvalue for a brand new symbol Foo: > > In[1]:= Foo /: Plus[b_Foo] := b; > > > Nothing shocking about this rule: it just recapitulates the default > behavior of Plus when given a single argument. And it seems to > work: > > In[2]:= Plus[Foo[1]] > Out[2]= Foo[1] > > > ...but disaster lurks just around the corner: > > In[3]:= 1 + Foo[1] > During evaluation of In[3]:= $IterationLimit::itlim: Iteration limit of > 4096 exceeded. >> > Out[3]= Hold[1 + Foo[1]] > > > I was expecting that 1 + Foo[1] would evaluate to itself, not an > infinite loop.... So I examined a trace: > > In[4]:= ToString[ > StringForm["``", > FullForm /@ Take[Quiet[Trace[1 + Foo[1]]], 10] // ColumnForm]] > > Out[4]= "HoldForm[Plus[1, Foo[1]]] > HoldForm[Plus[1, Foo[1]]] > HoldForm[Plus[1, Foo[1]]] > HoldForm[Plus[1, Foo[1]]] > HoldForm[Plus[1, Foo[1]]] > HoldForm[Plus[1, Foo[1]]] > HoldForm[Plus[1, Foo[1]]] > HoldForm[Plus[1, Foo[1]]] > HoldForm[Plus[1, Foo[1]]] > HoldForm[Plus[1, Foo[1]]]" > > > > > Judging from the trace, the evaluator is attempting to evaluate > the same expression over and over. The evaluator is supposed to > stop when it reaches a fixed point, and that looks like a fixed > point if I ever saw one. (In fact, in this case, we started at > the fixed point to begin with!) So either there's a very serious > bug in the evaluator, or the documentation I read on the subject > was wrong about how it's supposed to work. (FWIW, this is Mathematica > 7.) > > > Whatever it is that I'm doing wrong, it seems to me *very fundamental*. > IOW, this does not look to me like some obscure corner case. If > so, I can't understand how I could have missed it in all the reading > I've done about Mathematica over the years. It's occurrences like > this that fuel my *paranoia* about the Mathematica documentation. > > If someone can tell me 1) what I'm doing wrong above, and hopefully > 2) how to fix it, I'd much appreciate it. Also, if you could point > me to where in the documentation I would have learned the answers > to these questions I'd be grateful. > > TIA! > > ~kj > > >