Re Need a new type of Hold
- To: mathgroup at smc.vnet.net
- Subject: [mg7675] Re [mg7538] Need a new type of Hold
- From: Dick Zacher <dick at loc3.tandem.com>
- Date: Thu, 26 Jun 1997 01:36:58 -0400 (EDT)
- Organization: Tandem Computers
- Sender: owner-wri-mathgroup at wolfram.com
Ersek_Ted%PAX1A at mr.nawcad.navy.mil wrote:
>
> In [mg7538] Dave Wagner replied to my desire for a new type
> of Hold .... My original correspondence was [mg7499].
>
> I recently figured out how to change HoldForm so that it works pretty
> much the way I want the new type of Hold to work.
> The only problem is that I lose the usual implementation of HoldForm
> along the way.
>
> Can someone out there build this feature without messing up HoldForm.
>
> (*-------------------------------------------------*)
>
> In[1]:= Unprotect[HoldForm];
> HoldForm/:g_[a___,HoldForm[expr_],b___]/;
> (g=!=FullForm && g=!=Set && g=!=SetDelayed &&
> g=!=List && g=!=Part) := g[a, expr, b]
>
> (* "a___" and "b___" are BlankNullSequences *)
>
> In[2]:= foo=HoldForm[z+2+d+a+3]
>
> Out[2]= z+2+d+a+3
>
> In[3]:= foo-d+4
>
> Out[3]= 9+a+z
>
> In[4]:= HoldForm[z+2+d+a+3] //FullForm
>
> Out[4]//FullForm=
> HoldForm[Plus[z, 2, d, a, 3]]
>
> In[5]:= foo+b
>
> Out[5]= 5+a+b+d+z
>
> (*________________________*)
> ...
> ...
> Some important points:
> - This should work on any expression, not only those with Plus for a Head.
> - I want to use the held results later on without releasing the hold.
> - When the held result is used in later calculations, the hold should be
> released automatically.
> ...
> ...
I couldn't resist working on this one, and learned a lot from it; so
I'll share my own attempt at a solution. It is based on Ted's solution,
above, but suppresses the output of HoldTemporary via an additional
definition for MakeBoxes rather than by redefining HoldForm. Because of
this, it's only useful for Mma 3.0 or later.
(*v v v v v v v v v v v v v v v v v v v*)
SetAttributes[HoldTemporary,HoldAll]
mb:MakeBoxes[_,_]:=
ReleaseHold[(
Hold[mb]//.{HoldPattern[HoldPattern[HoldTemporary[e_]]]:>e})]/;
!FreeQ[Hold[mb],HoldPattern[HoldPattern[HoldTemporary[_]]]]
HoldTemporary/:g_[a___,HoldTemporary[e_],b___]:=
g[a,e,b]/;g=!=Set&&g=!=FullForm
(*^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^*)
We won't go into how long it took me to figure out the need for those
nested HoldPattern functions.
The above definitions show the following behavior:
(*v v v v v v v v v v v v v v v v v v v*)
In[4]:= foo=HoldTemporary[z+2+d+a+3]
Out[4]= z+2+d+a+3
In[5]:= foo-d+4
Out[5]= 9+a+z
In[6]:= HoldTemporary[z+2+d+a+3] //FullForm
Out[6]//FullForm= Plus[z,2,d,a,3]
In[7]:= foo+b
Out[7]= 5+a+b+d+z
(*^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^*)
Since I don't really understand the application, I don't know how well
this solution meets the requirements; but it seems to work on the
examples given, and I don't think it breaks any other functions.
--
-----------------------------
Dick Zacher
Performance Engineering Dept., Tandem Computers
zacher_dick at tandem.com phone: 408-285-5746 fax: 408-285-7079