Re: Finding variables in a very long expression
- To: mathgroup at smc.vnet.net
- Subject: [mg31410] Re: Finding variables in a very long expression
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Sat, 3 Nov 2001 05:29:16 -0500 (EST)
- References: <9rq7ia$ill$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Ted: You say >If I had my way removing a symbol would make the kernel work as if the symbol > never had any values, but that's not the way it works. Some thoughts on this: We see Remove apparently wrapped round occurences of removed symbols in stored values a = A[b]; Remove[b]; a A[Removed[b]] Something like this is needed to preserve the stucture of the value, and to indicate the removal. But this is more than just wrapping FullForm[%] A[Removed["b"]] AtomQ[%] False and replacement does not work: a/."b"->3 A[Removed[b]] Moreover, if I simply type and evaluate the result is not the same: AtomQ[Removed["b"]] False So something more is going on that I haven't sorted out yet. b does not now exist ?b Information::notfound: Symbol b not found. And we can re-create and set a value to b: b= 5 5 without affecting the value of a: a A[Removed[b]] If we had just "make the kernel work as if the symbol never had any values" (which would seem to be what ClearAll[b] would have done) then this would not have been been possible. -- Allan --------------------- Allan Hayes Mathematica Training and Consulting Leicester UK www.haystack.demon.co.uk hay at haystack.demon.co.uk Voice: +44 (0)116 271 4198 Fax: +44 (0)870 164 0565 "Ersek, Ted R" <ErsekTR at navair.navy.mil> wrote in message news:9rq7ia$ill$1 at smc.vnet.net... > Jose Flanigan wanted to know how to find all variables in an expression. > Consider expr below. > > In[1]:= > expr=Sqrt[x*y]+x*z+w Sqrt[x]z^(1/n)+Pi/3; > w=v; > > The simple line below almost works, but the list includes Pi which isn't a > variable. The third argument of Cases here is a level specification. You > can read about Cases and level specification at my web site (URL below). > > In[3]:= > Union[Cases[expr, _Symbol, {0, -1}]] > > Out[3]= > {n, Pi, v, x, y, z} > > > The next line eliminates symbols such as Pi. > > In[4]:= > Union[Cases[expr, _Symbol?( !NumericQ[#]& ), {0, -1} ]] > > Out[4]= > {n, v, x, y, z} > > > --- The Plot Thickens --- > At the 1999 Developer Conference Robby Villegas explained that this sort of > thing gets tricky when you are working with symbols that were previously > removed. Consider the lines below where the symbol (v) is removed. If I > had my way removing a symbol would make the kernel work as if the symbol > never had any values, but that's not the way it works. > > In[5]:= > Remove[v] > > In[6]:= > Union[Cases[expr, _Symbol?( !NumericQ[#]& ), {0, -1} ]] > > Out[6]= > {n, Removed[v], x, y, z} > > > If you want to make sure your list of variables is free of Removed Symbols > use the next line (based on Robby Villegas talk). > > In[7]:= > Union[Cases[expr, _Symbol?( !NumericQ[#] && NameQ[ToString[#]]& ), {0, > -1} ]] > > Out[7]= > {b, x, y, z} > > > --- > Regards, > Ted Ersek > Check Mathematica Tips, Tricks at > http://www.verbeia.com/mathematica/tips/Tricks.html > >