Re: HoldFirst question
- To: mathgroup at smc.vnet.net
- Subject: [mg65589] Re: HoldFirst question
- From: albert <awnl at arcor.de>
- Date: Mon, 10 Apr 2006 02:31:09 -0400 (EDT)
- References: <e10901$lio$1@smc.vnet.net> <e12tmj$jih$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hi,
> Bear in mind that a HoldFirst function can evaluate its argument - it is
> just that this does not happen automatically. It is easy to write such a
> function yourself:
>
> SetAttributes[ff,HoldFirst];
> ff[x_]:=(Print[HoldForm[x],"=",x];x)
>
> Set clearly evaluates the Head of the lhs.
In fact the LHS is evaluated only in certain cases, depending on what the
LHS looks like. LHS that are just symbols are never evaluated, otherwise
there would not be the possibility to redefine "variable" values. More
complicated things like a[[n]] or f[x_] will obviously be at least
partially evaluated, most probably with the goal to make the definitions
behave as the user would expect, where it is of course difficult to define
what the user would expect. It is interesting to note e.g. the following:
In[1]:= ClearAll[f,g]
In[2]:= f=g
Out[2]= g
In[3]:= f[x_]=2 x
Out[3]= 2 x
In[4]:= DownValues[f]
Out[4]= {}
In[5]:= DownValues[g]
Out[5]= {HoldPattern[g[x_]] :> 2 x}
In[6]:= f=.
In[7]:= f[2]
Out[7]= f[2]
In[8]:= g[2]
Out[8]= 4
probably surprising but not unreasonable, I wonder if this is all well
documented, though...
albert