Re: string-variable-Set-snarl
- To: mathgroup at smc.vnet.net
- Subject: [mg22457] Re: [mg22491] string-variable-Set-snarl
- From: Bojan Bistrovic <bojanb at python.physics.odu.edu>
- Date: Wed, 8 Mar 2000 02:21:54 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
> 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. > > It's a bit tricky ; what you need is MakeExpression instead of ToExpression since MakeExpression[animalname] returns HoldComplete[cow] where cow has a head Symbol, not String. Now you have to Map the Set function inside the HoldComplete and then remove the HoldComplete Head with ReleaseHold: In[1]:= {cow = Random[], emu = Random[], ant = Random[]} Out[1]= {0.2, 0.3, 0.4} ... In[25]:= animalname Out[25]= cow In[26]:= Head[animalname] Out[26]= String In[27]:= ReleaseHold[Map[Function[arg1,arg1=2,{HoldFirst}], MakeExpression[animalname]]] Out[27]= 2 Note that the "{HoldFirst}" part is necessary to prevent the left-hand side of "arg1=2" being evaluated In[28]:= animalname Out[28]= cow In[29]:= cow Out[29]= 2 Bye, Bojan -- --------------------------------------------------------------------- Bojan Bistrovic, bojanb at jlab.org Old Dominion University, Norfolk VA & Jefferson Lab, Newport News, VA ---------------------------------------------------------------------