2
$\begingroup$

I'm trying to create several symbols and assign values to them. Here's what currently appears to work:

Evaluate[Symbol["fdds" <> ToString[10]]] = 1

But there's then another problem: I can't clear it without explicitly saying fdds10, i.e. this code

Evaluate[Symbol["fdds" <> ToString[10]]] =.

as well as this

Clear[Evaluate[Symbol["fdds" <> ToString[10]]]]

give errors: the former gives

Unset::usraw: Cannot unset raw object 1. >>

and the latter results in

Clear::ssym: 1 is not a symbol or a string. >>

How do I create good easily manageable symbols?

PS: I know I could use something like fdds[[10]] here, but I'm interested in symbol-based solution.

$\endgroup$
0

3 Answers 3

6
$\begingroup$

You can apply Clear to the result of the expression generated by the string by using the optional third argument of ToExpression:

Evaluate[Symbol["fdds" <> ToString[10]]] = 1

(* ==> 1 *)

fdds10

(* ==> 1 *)

ToExpression["fdds" <> ToString[10], InputForm, Clear]

fdds10

(* ==> fdds10 *)

The third argument of ToExpression is Clear and wraps the expression fdds10 before it is evaluated.

$\endgroup$
2
  • $\begingroup$ What would be the principal difference between Symbol and ToExpression here if the latter is used just with one argument? Could I just replace the former with the latter for the first assignment? $\endgroup$
    – Ruslan
    Jun 28, 2014 at 19:35
  • $\begingroup$ @Ruslan ToExpression is just a more high-level function that can act on expressions (even lists of expressions). The strings accepted by Symbol are limited to be valid symbol names. Because of this relationship, you can definitely use ToExpression in place of Symbol when you're sure you've constructed a valid symbol name string. $\endgroup$
    – Jens
    Jun 28, 2014 at 19:43
4
$\begingroup$

Clear works on Strings exactly for such cases (I believe).
You must still evaluate StringJoin, my favorite way being Apply:

Clear @@ {"fdds" <> ToString[10]}

If this is all you need the question should be marked as a duplicate of:

If we wish to make the question unique we can look at the more difficult case of Unset as applied to other kinds of definitions (those besides OwnValues). For example:

Evaluate[Symbol["foo" <> ToString[10]][x_?Negative]] = 1;
Evaluate[Symbol["foo" <> ToString[10]][x_]] = 2;

How to Unset the first definition leaving the second in place?

These definitions work:

foo10[-3]
foo10[5]
1
2

However, due to the generic nature of the second definition this will evaluate in a way we do not want:

Evaluate[Symbol["foo" <> ToString[10]][x_?Negative]]   (* Evaluate merely for consistency *)
2

We can evaluate the Symbol foo10, since here it does have a value assigned, and insert it with Function:

Unset[#[x_?Negative]] & @ Symbol["foo" <> ToString[10]]

Definition[foo10]
foo10[x_] = 2

Also related:

$\endgroup$
1
$\begingroup$

I don't understand exactly what your application is, but looking at your usage I would guess, you don't want fdds[[10]] as you would need to initialize an array?

fdds[[10]] // FullForm
Part[fdds,10]

In this case you could use fdds[10]. Note that [[]] is not [] and you do not need to initialize anything.

fdds[10] // FullForm
fdds[10]
fdds[5] = 1;
fdds[10] = 2;
fdds // Definition
fdds[5]=1
fdds[10]=2
Unset[fdds[10]]
fdds // Definition
fdds[5] = 1

edit: Now I know, this is answer is not suitable for OPs case, but maybe the answer helps someone new to Mathematica to avoid messy method.

$\endgroup$
4
  • $\begingroup$ Please note the PS part of the question, which has been there since the very beginning. I do know I can do this like an array, but I'm interested in symbol-based approach. $\endgroup$
    – Ruslan
    Jun 28, 2014 at 21:42
  • $\begingroup$ @Rusian It is not an array. [] is not [[]]. And I don't know what do you mean by "symbol-based". Do you need, that the Head is a Symbol? Could you tell why? $\endgroup$
    – Johu
    Jun 28, 2014 at 21:50
  • $\begingroup$ I was just interested in creating a usable symbols. I'm well aware of the possibility to use hash maps like fdds[anything]=1. $\endgroup$
    – Ruslan
    Jun 29, 2014 at 6:04
  • $\begingroup$ @Ruslan. Ok. Now you told we words. I hope the answer still helps someone else to avoid messy methods. $\endgroup$
    – Johu
    Jun 29, 2014 at 12:00

Not the answer you're looking for? Browse other questions tagged or ask your own question.