MathGroup Archive 2006

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

Search the Archive

Re: Clearing a symbol known only through a definition

  • To: mathgroup at smc.vnet.net
  • Subject: [mg66676] Re: [mg66658] Clearing a symbol known only through a definition
  • From: "Carl K. Woll" <carlw at wolfram.com>
  • Date: Sat, 27 May 2006 03:50:46 -0400 (EDT)
  • References: <200605260817.EAA01750@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Andrew Moylan wrote:
> Suppose I have a symbol "a" that is defined to be equal to another 
> symbol. (E.g. It might be that a := b.) How can I clear the value of the 
> symbol 'pointed to' by "a", without knowing explicity what symbol that is?
> 
> Clear[a] won't do, of course.
> Clear[Evaluate[a]] won't do, because that will evaluate to 
> Clear[Evaluate[b]], which will in turn (in general) evalulate to 
> Clear["whatever b evalulates to"].
> 

In this case, the function OwnValues is useful. For example:

a:=b

In[42]:= OwnValues[a]

Out[42]= {HoldPattern[a] :> b}

So, a function to clear the symbol pointed to by a could be:

SetAttributes[clearownsymbol, HoldFirst];

clearownsymbol[x_] := Module[{own},
   own = OwnValues[x];
   If[MatchQ[own, {_ :> _Symbol}],
     Clear @@ Extract[own, {1, 2}, Hold]
   ]
]

For your example:

a:=b
b=3;

In[48]:= b

Out[48]= 3

In[49]:= clearownsymbol[a]

In[50]:= b

Out[50]= b

> ----
> Alternatively, here is the particular problem I want to solve:
> 
> For any expression e, either e is a symbol, or Head[e] is, or 
> Head[Head[e]] is, etc. Call this the "topmost symbol" in the expression. 
> Thus, the topmost symbol in f[x][y][z] is f.
> 
> I want to write a function that takes an expression and calls Clear[] on 
> its topmost symbol. Can anyone think of a simple way to write such a 
> function?

Unless there is more going on here, I don't see how your first issue 
relates to this problem. At any rate, here is a function that does what 
you want:

SetAttributes[tophead, HoldFirst]

topheadclear[a_Symbol] := Clear[a]
topheadclear[b_[___]] := topheadclear[b]

f=g;

In[57]:= f

Out[57]= g

In[58]:= topheadclear[f[x][y][z]]

In[59]:= f

Out[59]= f

Of course, f[x][y][z] without a hold gets evaluated to

g[x][y][z]

and there is no way to clear f based on the input g[x][y][z].

Carl Woll
Wolfram Research


  • Prev by Date: Different text style for labels and ticks
  • Next by Date: Re: Re: Graphics3D axes
  • Previous by thread: Re: Clearing a symbol known only through a definition
  • Next by thread: Re: Clearing a symbol known only through a definition