> -----Original Message-----
> From: Ulrich Jentschura [mailto:ulj@XXXXXXX.gov]
> Sent: Wednesday, August 01, 2001 9:01 PM
> To: dmug@XXXXXXX.ch
> Subject: Programmierung mit Zeichenketten
>
>
>
> Hallo, liebe Mathematica-DMUG-Vereinsmitglieder,
>
> ich stehe gerade vor folgendem Problem: Eine Routine zu schreiben, die
> letztendlich in einem Ausdruck erkennt, ob Symbole mit Namen
>
> xyz21 oder xyz33 oder xyz76
>
> vorhanden sind, d.h. ob es im Ausdruck Variablen mit diesen
> Namen gibt,
> und dann diese Variablen so analysiert, dass aus
>
> xyz21 -> xyz[2,1]
>
> xyz33 -> xyz[3,3]
>
> xyz76 -> xyz[7,6]
>
> wird. Das heisst, am Ende sollte eine Routine, nennen wir sie
> "Transform",
> dastehen, so dass
>
> In[1]:= Transform[3 t u^2 v xyz46 + 7 t^2 u xyz56]
>
> Out[1]= 3 t u^2 v xyz[4,6] + 7 t^2 u xyz[5,6]
>
> dasteht. Eigentlich sollte das einfach sein, aber...
>
> Ueber Antworten/Tips wuerde ich mich sehr freuen,
>
> Viele Gruesse,
>
> Ulrich
>
>
> --
>
> zur Zeit in USA:
> Dr. Ulrich Jentschura (ulj@XXXXXXX.gov)
> N.I.S.T. - Gaithersburg, MD 20899-8401
>
Lieber Ulrich,
zu deinem Problem mache ich noch folgende Annahmen:
(1) ich fasse "xyz" wörtlich auf, meine also nicht irgendeinen alpha-string.
(2) nur die letzten zwei Buchstaben des Symbolnamens sind numerisch, es
werden also nur zwei Ziffern betrachtet (anderfalls bräuchtest du noch einen
"Separator")
(3) ich nehme an, die fraglichen Symbole "xyz46" etc. haben alle keinen
Wert, evaluieren also nicht.
Dann schlage ich folgendes vor: (ist jetzt aus dem Kopf, hoffe es haut hin!)
Transformiere deinen Ausdruck expr:
expr /. s_Symbol /; StringMatchQ[SymbolName[s], "xyz*"] :>
With[{sname=SymbolName[s]},
Module[{x=ToExpression[StringTake[sname,{-2}]],
y=ToExpression[StringTake[sname,{-1}]]},
xyz[x,y] /; IntegerQ[x]&&IntegerQ[y]&&
StringLength[sname]==5
]]
wenn dann irgendwas für xyz[x_,y_] definiert ist läuft die Maschine weiter.
Gruß, Hartmut