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