Skip to main content

function construction - Why x = x doesn't cause an infinite loop, but f[x_] := f[x] does?


If I execute:


In[1] := x = x
Out[1] = x

and then I evaluate the symbol x:


In[2] := x
Out[2] = x


it simply returns x itself. I don't understand why this doesn't result in an infinite loop. Given that x references itself after the assignment x = x, I think that evaluating x should result in an infinite loop (x is replaced by x, which is replaced x, and so on). What am I missing?


Contrast this with what happens with the assignment:


f[x_] := f[x]

Evaluating f[x] after this assignment results in an infinite loop:


In[5]:= f[x]


During evaluation of In[5]:= $IterationLimit::itlim: Iteration limit of 4096 exceeded.




Out[5]= Hold[f[x]]

Edit: Using x := x instead of x = x does not cause an infinite loop. Using x = Identity[x] does not cause an infinite loop either. But using x := Identity[x] as suggested by Jacob Akkerboom in the comments results in an infinite loop. Why?




Comments