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