TR (Parsing - one step further)
-
Folgendes: Ich schreibe gerade einen etwas besseren Taschenrechner. Hierzu stellt sich mir die Frage: wie regle ich Zuweisungen richtig?
a[0]=7 soll genauso gehen wie z=4 und (ja, lambda *g* - nich lambada) square=lambda(x)x*x...
ebenso möchte ich sagen können: (a,b)=(b,a). Hierzu hab ich mir mehrere Möglichkeiten überlegt:- einen Parse-Tree erstellen und den dann von oben wieder aufrollen
- für die linke Seite eine eigene Grammatik erstellen
- bezeichner wie a oder b geben nicht zurück (in der grammatik, recursiv) den wert sondern eine referenz auf diesen
problematisch sind bei punkt 1 und 2 der aufwand, bei punkt 3 wird (a,b)=(b,a) kompliziert...
punkt 2 find ich eher weniger ellegant und möchte diese möglichkeit am ehesten verwerfen
was würdet ihr machen?
-
ich nehm jetz hauptsächlich methode 1, falls notwendig mit etwas pfeffer 3
-
Du könntst es mit einer Stack-Maschine machen.
Ein Simples Z=4 wäre dann
push 4
assign (z) // popt element vom Stack(a,b) = (b,a)
push b
push a
assign(b)
assign(a)Das könnte man für beliebig komplexe Formeln verwenden:
a=z*(x+y)
push(x)
push(y)
add // popt zwei Werte vom Stack, addiert sie und pusht das Ergebnis wieder
push z
mult // wie add
assign (a)Je nachdem, wie du deine Variablen verwaltest musst du beim assign dann statt dem Namen die Adresse übergeben.
-
@frenki: die idee ist vor allem in kombination mit meinem so geliebten lambda recht praktisch. das werden aber eindeutig mehr als die bislang existierenden 700 zeilen code. *g*
ps: stellt sich nur noch die frage, ob ich die funktion wirklich "CreateDaFuckinImmCode" nennen sollte