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: [mg66555] Re: [mg66550] HoldAll
  • From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
  • Date: Sat, 20 May 2006 04:46:49 -0400 (EDT)
  • References: <200605190740.DAA12901@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

On 19 May 2006, at 16:40, 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?
>
> Thanks to all
> MR
>

I think you are misunderstanding what HoldAll does. Functions without  
this attribute (or other similar ones, like HoldFirst, HoldRest etc)  
first pre-evaluate the arguments, then insert them into the body of  
the function and then evaluate the body of the function.  Functions  
with the HoldAll attribute do not pre-evaluate their arguments, but  
insert them into the body and evaluate it as part of the body. So  
both of your examples behave in exactly he same way, except that as  
there is no "function body" in the former case "evaluating the body"  
does not amount to anything. You can perhaps see this more clearly by  
looking at the following example:


ClearAll[ff]


SetAttributes[ff, HoldFirst]

ff[x_,y_]:={Hold[x],x,Hold[y],y}


ff[1+2,3+4]


{Hold[1+2],3,Hold[7],7}

The function ff has the HoldFirst attribute so the argument 1+2 was  
not pre-evaluated. However, inside the body of the function it was  
evaluated, which is why you got the Hold[1+2] and 3 as the first two  
elements in the output. On the other hand since ff evaluates it's  
second argument it was evaluated before being inserted into the  
function body, so you got Hold[7] and 7 in the output.

Andrzej Kozlowski
Tokyo, Japan


  • References:
    • HoldAll
      • From: umrakmm@cc.umanitoba.ca
  • Prev by Date: Re: problem for "Fit"
  • Next by Date: Re: Exporting Graphics to .eps
  • Previous by thread: HoldAll
  • Next by thread: Re: HoldAll