I'm trying to understand how Mathematica thinks about the results of
Set. Suppose we perform
LHS = RHS. I'm focusing on when Mathematica considers
LHS to be fully evaluated and when it decides to evaluate
LHS again later.
Discussion and Examples
Suppose I do the following:
(* First example *) ClearAll[ LHS, f, F ]; LHS = f[x]; (* f[x] *) f[x_] := F[x] LHS (* F[x] *)
This is what I would have expected to happen --
LHS is re-evaluated at the end.
Now, the following works a bit differently:
(* Second example *) ClearAll[LHS, f, F, changeQ]; changeQ[x_] := False f[x_?changeQ] := F[x] LHS = f[x]; changeQ[x] := True LHS (* f[x] *)
Apparently Mathematica decided not to re-evaluate
LHS at the end, otherwise it would evaluate to
F[x]. This is a case where
f[x] evaluate to different quantities.
Interestingly enough, swapping the order of two lines in the above changes the outcome:
(* Third example *) ClearAll[LHS, f, F, changeQ]; changeQ[x_] := False LHS = f[x]; f[x_?changeQ] := F[x] changeQ[x] := True LHS (* F[x] *)
Swapping the order made
LHS re-evaluate at the end, just like in the first example.
This leads me to more formally pose and tentatively answer the question:
Suppose, for some choice of
additionalCode, we perform
initialCode LHS = f[x]; (* f[x] *) additionalCode LHS
LHS originally evaluated to
For what types of
initialCode) does the final evaluation of
LHSyield something different from evaluating
f[x]evaluate to different values (as is the case at the end of the second example above), is it possible to somehow "force"
LHSto evaluate in the same way as
Tentative Answer to Question 1
(Based on evidence from above examples)
LHSwill re-evaluate when
additionalCodegives a down value to
f(See 1st and 3rd examples above)
LHSwill not re-evaluate in general. (See 2nd example above, where a down value was given to a different function,
Assuming the tentative answer is along the right track, I'm looking for two things:
- How does Mathematica 'know' when to re-evaluate
LHS? I'm particularly interested in the vocabulary used to describe the process.
- Are there any other conditions under which
- Is there a generic way to force
LHSto re-evaluate? (This is similar to the second question above.)
Of course, I'd welcome any suggestions for good references on this.