Este post ha sido analizado por nuestros especialistas para que tengas la garantía de la veracidad de esta reseña.
Solución:
Asumiré que desea una sintaxis compacta para que sea práctico de usar.
elegiré cs
representando el símbolo compuesto:
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
Prueba:
i = 10;
cs["d", i] = 30;
d10
30
Se puede usar cualquier expresión siempre que sus formas evaluadas se concatenen a un nombre de símbolo válido:
cs[Pi, d10, "x"] = 86;
Pi30x
86
La reasignación es posible:
cs[Pi, d10, "x"] = 99;
Pi30x
99
Si la concatenación produce un nombre de símbolo no válido $Failed
es regresado:
cs[5, "x"] = 30
$Failed
(Los nombres de los símbolos no pueden comenzar con números).
Lectura recomendada:
-
Asignación de valores a una lista de nombres de variables
-
Manipulación elegante de la lista de variables.
-
¿Cómo ‘combinar’ una lista como FromDigits, pero con una mezcla de números y símbolos?
-
¿Cómo carga programáticamente datos en símbolos? (especialmente la respuesta de Kuba)
A pesar de la excelente respuesta aceptada por Mr.Wizard, creo que vale la pena señalar que el enfoque idiomático estándar del problema en Matemática es usar variables indexadas:
In[1]:= i = 10;
d[i] = 30;
Definition[d]
d[10] = 10;
Definition[d]
Out[3]= d[10] = 30 Out[5]= d[10] = 10
Tienes la posibilidad mostrar esta división si si solucionó tu problema.