Making command called HoldTemporary
- To: mathgroup at smc.vnet.net
- Subject: [mg7693] Making command called HoldTemporary
- From: Ersek_Ted%PAX1A at mr.nawcad.navy.mil
- Date: Sun, 29 Jun 1997 22:17:28 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
I made further progress on the HoldTemporary command I am trying to build. See below. The idea behind HoldTemporary is to prevent further simplification or ordering of terms in the expression, but allow the user to perform later work on the result as if it was completely evaluated (not held). The code I show below does this for a limited number of cases. More work is needed to make it complete. But as Fermat said this margin is too small to include the details. It's better to use MakeBoxes instead of Format. Why? Because you can edit the output made by MakeBoxes, and it will be treated as a new expression. The Mma Book says MakeBoxes should be used recursivly. It seems the kernal automatically makes the first call to MakeBoxes to determine how the result should be displayed. MakeBoxes must have two arguments. For the second argument "form_" the kernal will use the specified Form for the Cell evaluated (ie. TraditionalForm, StandardForm, etc. ). In the code below I make FullForm lie about what the FullForm of the temporary held result is. Then I need to make special rules for commands like Part to give the appearance that the displayed FullForm is correct. Ted Ersek ersek_ted%pax1a at mr.nawcad.navy.mil ----------------- ------------------------ ------------------- In[1]:= $WillReleaseHoldTemporary= {Plus, Times, Power, Exp, Integrate, (* and many others *) }; SetAttributes[HoldTemporary, HoldAll] HoldTemporary/:MakeBoxes[HoldTemporary[expr_], form_]:= MakeBoxes[expr, form] HoldTemporary/:g_[a___,HoldTemporary[expr_], b___]/; MemberQ[$WillReleaseHoldTemporary, g]:=g[a, expr, b] Unprotect[FullForm]; FullForm/:MakeBoxes[FullForm[HoldTemporary[expr_]], form_]:= MakeBoxes[FullForm[expr], form]; Protect[FullForm]; HoldTemporary/:Part[HoldTemporary[expr_], n_]/;(Head[n]=!=List):= Part[Hold[expr], 1, n] In[7]:= foo=HoldTemporary[z+2+d+a+3] Out[7]= z+2+d+a+3 In[8]:= foo-d+4 Out[8]= 9+a+z In[9]:= HoldTemporary[z+2+d+a+3]//FullForm Out[9]= Plus[z, 2, d, a, 3] In[10]:= Integrate[foo,z] Out[10]= (5+a+d) z+z^2/2 In[11]:= Part[foo,4] Out[11]= a