MathGroup Archive 2000

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

Search the Archive

Re: string-variable-Set-snarl

  • To: mathgroup at smc.vnet.net
  • Subject: [mg22489] Re: [mg22491] string-variable-Set-snarl
  • From: Hartmut Wolf <hwolf at debis.com>
  • Date: Wed, 8 Mar 2000 02:22:29 -0500 (EST)
  • Organization: debis Systemhaus
  • References: <200003050524.AAA14078@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

James Fuite and Tania Nordli schrieben:
> 
> Dear Advanced Mathematica Users,
> 
>  The following is a short and perhaps trivial problem that has caused me
> some frustration.  I cannot write a program that allows me to change the
> value of any given variable if given the name of the variable as a
> string.  What follows is an equivalent situation.  Let
> 
> In[3]=      {cow = Random[], emu = Random[], ant = Random[]}
> Out[3]=    {0.2, 0.3, 0.4}
> 
>        . . . . some selection process . . . .
> 
> In[25]=      animalname
> Out[25]=    cow
> 
> In[25]=     Head[animalname]
> Out[25]=   String
> 
> Given a string, here "cow", corresponding to a variable, here cow, I
> cannot clear or set a value for the variable itself.  Of course I cannot
> use Clear[cow] or cow = 2 because I do not know which variable will be
> chosen, as represented by the variable animalname.  My lame attempts
> such as Clear[animalname] or ToExpression[animalname] = 2 only fail to
> affect cow - it seems that I am caught trying to work on the wrong side
> of the equals sign (Set)!  My goal would be a line such as:
> 
> In[28]=      ToExpression[animalname]
> Out[28]=    2
> 
> which I think would imply that cow = 2 and has thus been affected.  Who
> can guide me from line 25 to line 28?  What are the general
> considerations?
> 
>    Sincerely,
>    James J. Fuite.



Dear James,

normally I would not recommend doing that, but there may be occasions where 
this is applicable, namely when your symbols (variables) originate outside of 
Mathematica or are partially treated outside.

Here are a few functions to treat strings "as variables":
 
In[1]:=
makesymbol = (((mysymbol[#1] = Unevaluated at Unevaluated[#2]) &)[#, 
          Symbol[#]] &);
In[2]:= 
mysymbol[s_String] := (Clear[s]; makesymbol[s])
In[3]:=
mysymbol[s_Symbol] := mysymbol[ToString[Unevaluated[s]]]
In[4]:=
Attributes[setsymbol] = {HoldFirst};
In[5]:=
setsymbol[s_, rhs_] := ((#1 = #2) &)[mysymbol[Unevaluated[s]], rhs]


You only use the function setsymbol. Give it the name (i.e. a string) of a 
symbol (already existing or not) and it sets that symbol referred to, 
irrespectively of whether it already has a value or not.

In[6]:= setsymbol["cow", 11];
In[7]:= cow
Out[7]= 11

In[8]:= setsymbol["cow", 12];
In[9]:= cow
Out[9]= 12

In[10]:= Clear[cow]
In[11]:= cow
Out[11]= cow
 
For your convenience it's tolerant enough as to also accept the symbol 
itself:

In[12]:= setsymbol[aardvark, 4];
In[13]:= aardvark
Out[13]= 4

In[14]:= setsymbol[aardvark, 7];
In[15]:= aardvark
Out[15]= 7

In[16]:= setsymbol["aardvark", 8];
In[17]:= aardvark
Out[17]= 8

In[18]:= Clear["aardvark"]
In[19]:= aardvark
Out[19]= aardvark

That is standard functionality, you can also Clear a symbol by its name.


Now if you have a reference to a name:

In[21]:= animalname = "ant";
In[22]:= setsymbol[animalname, 99];
In[23]:= animalname
Out[23]= 99

you can't use it directly, since animalname will be redefined (as in 
ordinary Set)

However if you do

In[25]:= ant = 88;
In[26]:= animalname = "ant";

In[27]:= setsymbol[Evaluate[animalname], 99];
In[28]:= ant
Out[28]= 99

In[29]:= animalname
Out[29]= "ant"

All this works via a stored association of names with unevaluated symbols 
to be inserted at the lhs of Set (within setsymbol).

In[30]:= Information["mysymbol", LongForm -> False]
"Global`mysymbol"
mysymbol["aardvark"] = Unevaluated[aardvark]
 
mysymbol["animalname"] = Unevaluated[animalname]
 
mysymbol["ant"] = Unevaluated[ant]
 
mysymbol["cow"] = Unevaluated[cow]
 
mysymbol[s_String] := (Clear[s]; makesymbol[s])
 
mysymbol[s_Symbol] := mysymbol[ToString[Unevaluated[s]]]

As you see this association is not cleared when the variables themselves are 
cleared; a possible advantage is that you always overlook the names used. 
Otherwise you would have to supply your own function "clearsymbol".

I hope this will help you, and not cause too much trouble.

Kind regards,  Hartmut


  • Prev by Date: Re: How to do a Nonlinear Complex Fit ?
  • Next by Date: Re: string-variable-Set-snarl
  • Previous by thread: string-variable-Set-snarl
  • Next by thread: Re: string-variable-Set-snarl