Re: Variable Listing?
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg1036] Re: Variable Listing?
- From: wagner at bullwinkle.cs.Colorado.EDU (Dave Wagner)
- Date: Wed, 10 May 1995 06:45:31 -0400
- Organization: University of Colorado, Boulder
In article <3ocggf$o3o at news0.cybernetics.net>,
Paul A. Rubin <rubin at msu.edu> wrote:
>In article <3o9n01$b92 at news0.cybernetics.net>,
> deslover at ssec.wisc.edu (Daniel DeSlover) wrote:
>->Is there a way in Mma to view all variables that have been
>->defined during a current session? For example, in Matlab
>->I can use the "whos" command to get this display:
>->
>->
>->>> whos
>-> calib 431 by 5 2155 17240 Full
>-> datedata 1 by 3 3 24 Full
>-> day 1 by 1 1 8 Full
>-> mass 953 by 1 953 7624 Full
(stuff deleted)
>->Such a command in Mma would be nice if it doesn't exist.
>->
>->dan
>->deslover at vil.ssec.wisc.edu
>
>You can get a list of variable *names* fairly easily. Names["*"] will list
>every defined symbol (including kernel symbols). Names["@*"] will list
>every symbol except those starting with an upper case letter. This screens
>out most Mma keywords (which tend to begin with an upper case letter), but
>not the ones beginning with "$". The best approach, if you can discipline
>yourself accordingly, is never to work in the Global context. If you start
>your session by setting a new context (e.g., Begin["Work"]), then you can
>limit the name list to your context (Names["Work`*"]).
>
>* Paul A. Rubin Phone: (517)
Not necessary Paul; if you restrict the search with Names["Global`*"]
then you will get the names of only symbols that you have defined, not
the names of any kernel symbols (all of which live in the System`
context
In[1]:=
calib = Table[0, {431}, {5}];
In[2]:=
datedata = Table[0, {1}, {3}];
In[3]:=
day = 0;
In[4]:=
mass = Table[0, {953}, {1}];
In[5]:=
Names["Global`*"]
Out[5]=
{calib, datedata, day, mass}
Here's how to get most of the information that Dan wants. First, note
that the elements returned by Names are strings, not symbols:
In[6]:=
InputForm[%]
Out[6]//
InputForm=
{"calib", "datedata", "day", "mass"}
So we map the following function onto this list:
In[7]:=
info[name_String] :=
Module[{sym, dim},
sym = ToExpression[name];
dim = Dimensions[sym];
{ name, dim, Times@@dim, ByteCount[sym]}
]
In[8]:=
info["calib"]
Out[8]=
{calib, {431, 5}, 2155, 43116}
In[9]:=
info /@ Names["Global`*"] // TableForm
Out[9]//TableForm=
431
calib 5 2155 43116
1
datedata 3 3 84
day 1 12
dim 1 0
dim$ 1 0
info 1 0
953
mass 1 953 34324
name 1 0
sym 1 0
sym$ 1 0
Those symbols "info", "dim", etc. came from the definition of info itself.
In[10]:=
Names["Global`*"]
Out[10]=
{calib, datedata, day, dim, dim$, info, mass, name, sym, sym$}
In[11]:=
Remove[info, dim, sym]
In[12]:=
Names["Global`*"]
Out[12]=
{calib, datedata, day, mass, name}
This is kind of ugly, but we can eliminate all but "info" by putting the
implementation of the function into another context:
In[13]:=
info::usage = "info[s] returns the name, dimensions,
total size, and byte count for the symbol named s.";
In[14]:=
Begin["Private`"];
info[name_String] :=
Module[{sym, dim},
sym = ToExpression[name];
dim = Dimensions[sym];
{ name, dim, Times@@dim, ByteCount[sym]}
]
End[];
In[17]:=
Names["Global`*"]
Out[17]=
{calib, datedata, day, info, mass, name}
It still works like before. You could even hide the name "info" in the
private context, but then you'd have to refer to it as Private`info
whenever you wanted to call the function.
Dave Wagner
Principia Consulting
(303) 786-8371
princon at csn.net
http://www.csn.net/princon