Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2006
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2006

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

Search the Archive

Re: HoldAll

  • To: mathgroup at smc.vnet.net
  • Subject: [mg66554] Re: HoldAll
  • From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
  • Date: Sat, 20 May 2006 04:46:47 -0400 (EDT)
  • Organization: The Open University, Milton Keynes, UK
  • References: <e4jukh$d94$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

umrakmm at cc.umanitoba.ca wrote:
> Hello to everyone
> 
> Quick question with regards to why the HoldAll attribute no longer works once 
> you define the function.  For example, before the definition, it serves the 
> purpose it was meant to serve:
> 
> Input
> Clear[ff]
> SetAttributes[ff, HoldAll]
> ff[1, 2, 3 + 4]
> 
> Output
> ff[1, 2, 3 + 4]
> 
> But once I actually assign the "functional guts", it doesn't do what it did 
> above:
> ff[x_, y_, z_] := x + y + z;
> ff[1, 2, 3 + 4]
> 
> 10
> 
> Why?

It still works indeed; however it does not do what you think.

First, use *Remove* rather than *Clear* since clear delete the 
definitions associated to a symbol but not its attributes (se In[1]).

Second, *HoldAll* blocks the evaluation of the arguments of a function 
that is whatever lays between the square brackets (compare Out[4] and 
Out[6]).

To achieve what you are thinking of, you must enclose the definition of 
ff within a HoldAll function as in In[7]. You can still get the final 
result by using ReleaseHold (see In[9]).

In[1]:=
Remove[ff]

In[2]:=
ff[1, 2, 3 + 4]

Out[2]=
ff[1, 2, 7]

In[3]:=
ff[x_, y_, z_] := x + y + z

In[4]:=
Trace[ff[1, 2, 3 + 4]]

Out[4]=
{{3 + 4, 7}, ff[1, 2, 7], 1 + 2 + 7, 10}

In[5]:=
SetAttributes[ff, HoldAll]

In[6]:=
Trace[ff[1, 2, 3 + 4]]

Out[6]=
{ff[1, 2, 3 + 4], 1 + 2 + (3 + 4), {3 + 4, 7},

   1 + 2 + 7, 10}

In[7]:=
ff[x_, y_, z_] := HoldForm[x + y + z]

In[8]:=
ff[1, 2, 3 + 4]

Out[8]=
1 + 2 + (3 + 4)

In[9]:=
ReleaseHold[%]

Out[9]=
10

HTH,
Jean-Marc


  • Prev by Date: problem for "Fit"
  • Next by Date: Beginner Question
  • Previous by thread: Re: HoldAll
  • Next by thread: Re: HoldAll