Implementiere einen Evaluator für eine sehr einfache Teilmenge von Forth.
Forth ist eine stapelbasierte Programmiersprache. Implementiere einen sehr einfachen Evaluator für eine kleine Teilmenge von Forth.
Dein Evaluator muss die folgenden Wörter unterstützen:
+, -, *, / (Ganzzahlarithmetik)DUP, DROP, SWAP, OVER (Stapelmanipulation)Dein Evaluator muss außerdem das Definieren neuer Wörter mit der üblichen Syntax unterstützen: : word-name definition ;.
Um es einfach zu halten, ist der einzige Datentyp, den du unterstützen musst, vorzeichenbehaftete Ganzzahlen mit einer Größe von mindestens 16 Bit.
Für die Syntax solltest du die folgenden Regeln verwenden: Eine Zahl ist eine Folge von einer oder mehreren (ASCII-)Ziffern, ein Wort ist eine Folge von einem oder mehreren Buchstaben, Ziffern, Symbolen oder Satzzeichen, die keine Zahl ist. (Forth verwendet wahrscheinlich leicht abweichende Regeln, aber das kommt dem schon sehr nahe.)
Bei Wörtern wird nicht zwischen Groß- und Kleinschreibung unterschieden.
In Forth heißen Funktionen words. Sie arbeiten auf einem Datenstack.
Jedes Wort entnimmt seine Parameter dem Stack und gibt seine Ergebnisse auf dem Stack zurück.
Die Forth-Dokumentation gibt immer den Zustand des Datenstacks vor und nach der Ausführung des Worts auf folgende Weise an: ( p1 p2 ... pN --- r1 r2 ... rN ).
Die Werte p1 bis pN stehen für die Parameter des Worts auf dem Stack vor dem Aufruf (weiter oben auf dem Stack können weitere Daten liegen, die hier nicht dargestellt sind), und die Werte r1 bis rN stehen für die Rückgabewerte des Worts auf dem Stack nach dem Aufruf.
Das Trennzeichen --- unterscheidet den Stackzustand vor und nach der Ausführung des Worts.
Die zu implementierenden Wörter sind wie folgt definiert:
| Wort | Stackzustand | Beschreibung |
|---|---|---|
+ |
( a b --- sum ) |
sum = a + b |
- |
( a b --- diff ) |
diff = a - b |
* |
( a b --- prod ) |
prod = a * b |
/ |
( a b --- quot ) |
quot = a / b |
dup |
( a --- a a ) |
den Wert auf dem ToS duplizieren |
drop |
( a --- ) |
den Wert auf dem ToS entfernen |
swap |
( a b --- b a ) |
die beiden Werte auf dem ToS vertauschen |
over |
( a b c --- a b c b ) |
den zweiten Wert auf den ToS kopieren |
Wenn du mit einem Online-Forth-Interpreter spielen oder mehr über die zu implementierenden Wörter erfahren möchtest, probiere Easy Forth aus (insbesondere die Abschnitte Adding Some Numbers, Defining Words und Stack Manipulation).
Melde dich bei Exercism an, um Odin mit 73 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.