How to name a variable with the value of another variable?

9

2

A simple but very important (at least for me) question. In some languages for defining a variable, for example, we can do:

i=10

"d"&i=30

So I have defined the variable d10, and...

d10=30

That is to say... I've named a variable (d10) as as function of an other variable (i).

How can I do this in Mathematica? Sorry if the title is bad.

Regards!

Luis Fernando Moura

Posted 2014-08-01T18:50:23.270

Reputation: 127

Try with Symbol["name"]: "refers to a symbol with the specified name." – unlikely – 2014-08-01T18:57:20.670

3Maybe there are shorter idioms for this, but one way is: Evaluate[ToExpression["d"~~ToString[i]]] = 30 – Daniel Lichtblau – 2014-08-01T19:08:21.890

1I'm wondering if you want x[i]? It's not exactly what you asked for; but if you don't know you can use x[i] as a variable, which represents x[10] when i is 10, then you might not know to ask for it. – Michael E2 – 2014-08-01T19:13:05.783

Daniel, your suggestion works very well. Thanks a lot. – Luis Fernando Moura – 2014-08-01T19:26:36.387

1@Luis Be aware that Daniel's simple suggestion will not allow reassignment. (As I'm sure he knows.) I again updated my answer to make clear that the method I gave does allow reassignments. – Mr.Wizard – 2014-08-01T19:40:11.777

Answers

8

I shall assume that you want a compact syntax to make this practical to use.
I shall choose cs, standing for compound symbol:

cs[x__] :=
  ToHeldExpression @ ToString @ Row @ {x} /.
    {_[s_Symbol] :> s, _ :> $Failed}

func_[a___, Unevaluated @ cs[x__], b___] ^:= 
  ToHeldExpression @ ToString @ Row @ {x} /.
    {_[s_Symbol] :> func[a, s, b], _ :> $Failed}

Test:

i = 10;
cs["d", i] = 30;

d10
30

Any expressions can be used so long as their evaluated forms concatenate to a valid Symbol name:

cs[Pi, d10, "x"] = 86;

Pi30x
86

Reassignment is possible:

cs[Pi, d10, "x"] = 99;

Pi30x
99

If an invalid Symbol name is produced by the concatenation $Failed is returned:

cs[5, "x"] = 30
$Failed

(Symbol names cannot start with numbers.)


Recommended reading:

Mr.Wizard

Posted 2014-08-01T18:50:23.270

Reputation: 259 163

3

Despite the accepted excellent answer by Mr.Wizard I think it is worth to point out that the standard idiomatic approach to the problem in Mathematica is to use indexed variables:

In[1]:= i = 10;
d[i] = 30;
Definition[d]
d[10] = 10;
Definition[d]
Out[3]= d[10] = 30

Out[5]= d[10] = 10

Alexey Popkov

Posted 2014-08-01T18:50:23.270

Reputation: 50 220

1

A brief, but related discussion: When to use indexed variables. I know the advantages/disadvantages of indexed variables have been discussed here and there on the site, but I'm having trouble locating relevant q & a. (+1)

– Michael E2 – 2014-08-02T13:31:31.743

For what it's worth this is covered in the A Better Alternative section at the top of my answer to the first linked question in my answer above. – Mr.Wizard – 2014-08-02T13:58:25.537