Forth

Forth

Schwer

Anleitung

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.

Implementierung

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:

  • ToS steht für Top of Stack
  • Der ToS wird als der rechteste Wert dargestellt
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).

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Odin Exercism

Bereit, mit Forth zu starten?

Melde dich bei Exercism an, um Odin mit 73 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.