|
[Date Index]
[Thread Index]
[Author Index]
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
>
>
>
Prev by Date:
Re: FileName Widget
Next by Date:
Re: Foo /: Plus[b_Foo] := b
Previous by thread:
Foo /: Plus[b_Foo] := b
Next by thread:
Re: Foo /: Plus[b_Foo] := b
|