Re: Evaluation details
- To: mathgroup at smc.vnet.net
- Subject: [mg86790] Re: Evaluation details
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Fri, 21 Mar 2008 01:52:49 -0500 (EST)
- Organization: University of Bergen
- References: <200803191026.FAA05164@smc.vnet.net> <frt57r$sjs$1@smc.vnet.net>
Andrzej Kozlowski wrote:
> On 19 Mar 2008, at 11:26, Mumbo Jumbo wrote:
>> Hello,
>>
>> I am quite puzzled why a Mathematica statement
>> x=x+1;
>> causes infinite recursion. Since the ducumentation states that the
>> lhs of
>> this statement is not evaluated, it seems to me that the evaluation
>> of the
>> rhs should not lead to recursive evaluation.
>> TIA, Yuri.
>>
>>
>
> The left hand side is not "pre-evaluated" but an OwnValue for x is
> created:
>
> In[3]:= Block[{$RecursionLimit = 20}, x = x + 1]
> "reclim" : "Recursion depth of 20 exceeded."
> Out[3]= Hold[x + 1] + 19
>
> In[4]:= OwnValues[x]
> Out[4]= {HoldPattern[x] :> Hold[x + 1] + 19}
>
> and then the rhs is evaluated, this OwnValue applied, a new OwnValue
> for x created etc.
[note: message CCd to MathGroup]
I believe that there is a little mistake here. The rhs is evaluated
first, and the OwnValue is only created afterwards. However, the return
value of Set[] is the same as the result of the evaluation of the rhs.
Mathematica keeps evaluating expressions (including the return value of
Set[]) until it reaches a fixed point. Now the OwnValue has already
been defined, so a fixed point is never reached: Mathematica goes into infinite
recursion.
So, if the input Block[{$RecursionLimit = 20}, x = x + 1]
is evaluated only once, the OwnValue will be simply x + 1
and not Hold[x + 1] + 19
In[1]:= Block[{$RecursionLimit = 20}, x = x + 1]
During evaluation of In[1]:= $RecursionLimit::reclim: Recursion depth \
of 20 exceeded. >>
Out[1]= 18 + Hold[1 + x]
In[2]:= OwnValues[x]
Out[2]= {HoldPattern[x] :> 1 + x}
Evaluating the same input again creates the OwnValue cited above:
In[3]:= Block[{$RecursionLimit = 20}, x = x + 1]
During evaluation of In[3]:= $RecursionLimit::reclim: Recursion depth \
of 20 exceeded. >>
Out[3]= 19 + Hold[1 + x]
In[4]:= OwnValues[x]
Out[4]= {HoldPattern[x] :> 19 + Hold[1 + x]}
Szabolcs Horvát
- References:
- Evaluation details
- From: "Mumbo Jumbo" <mjumbo@gmail.com>
- Evaluation details