MathGroup Archive 1999

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Standard Evaluation with UpValues

  • To: mathgroup at
  • Subject: [mg19394] Re: [mg19355] Standard Evaluation with UpValues
  • From: David Withoff <withoff at>
  • Date: Mon, 23 Aug 1999 13:57:10 -0400
  • Sender: owner-wri-mathgroup at

> Section 7.1.3 of the excellent book "Power Programming With Mathematica The
> Kernel" by David B. Wagner explains the main evaluation loop.  In that
> Section it indicates UpValues for a symbol are applied before DownValues for
> the symbol are applied.
> OK then consider the case below where (f) has both an UpValue and a
> DownValue defined by the user.
> At Out[4] the UpValue for (f) was used.  In that case the DownValue couldn't
> be used to evaluate f[t].
> Then at Out[5] the DownValue for (f) is used to evaluate  f[E] --> 1+E
> before the kernel checked to see if the UpValue would apply (and it would
> have).  I get the same result using Versions 3 and 4.
> When the kernel evaluates g[f[E]] it must figure out that the Head is (g)
> before it evaluates f[E].  After determining that the Head is (g) it checks
> to see if (g) has any Hold* attributes, and continues with evaluation as
> required.  So by the time the kernel evaluates f[E] it has all the 
> information it needs to know that the UpValue for (f) can be used.  However,
> the DownValue is used instead.  Wait a minute, aren't UpValues applied
> before DownValues are applied? 
> Can someone convince me that the main evaluation loop performs as explained
> by David Wagner when evaluating In[5] below?  Also can someone give a
> different example that more clearly shows that UpValues are used first?
> ------------------------------
> In[1]:=
> ClearAll[f,g,t];
> f[x_?NumericQ]:=1+x;
> f/:g[f[x_]]:=x+4; 
> In[4]:=
> g[f[t]]
> Ou[4]=
> 4+t
> In[5]:=
> g[f[E]]
> Out[5]=
> g[1+E]
> --------------------
> Regards,
> Ted Ersek

This behavior is not related to upvalues being applied before downvalues.
This behavior is just an illustration of expression elements being evaluated
before the enclosing expression is evaluated (normal-order evaluation) as
described in Section 2.5 and Appendix A.4 of The Mathematica Book.  In
this example, the expression element f[E] evaluates to something else before
the evaluator looks for evaluation rules for the enclosing expression.

Dave Withoff
Wolfram Research

  • Prev by Date: Re: strange problem with tickmarks
  • Next by Date: Mathematica 3->Mathematica 4 error: symptoms and cure
  • Previous by thread: Re: Standard Evaluation with UpValues
  • Next by thread: Re: Standard Evaluation with UpValues