
Forth: Beispiele und Erklärung
Reifegrad und Grenzen: experimentell
Umgesetzter Umfang: Stapeloperationen, Integer-Arithmetik, Wörter, Schleifen, Byte-Ein-/Ausgabe, Strings und numerische PB-Einbettung sind gezeigt.
Grenzen: Kein vollständiges Forth 2012; BASE/HEX und weitere Wörter fehlen, und Stapelmissbrauch ist nicht vollständig abgesichert.
Forth unterstützte Wörter und Umfang
Die sprachspezifische Referenz der unterstützten Befehle und des Umfangs mit durchsuchbaren Kategorien und klaren Grenzen öffnen.
Umfangsreferenz öffnenForth arbeitet mit einem Datenstack. Zahlen legen Werte ab; Wörter wie +, DUP und EXECUTE nehmen Werte vom Stack oder erzeugen neue. Die Reihenfolge ist Teil des Programms.
Zwölf Kurzbeispiele und ein größeres Programm. Wählen Sie ein Thema oder arbeiten Sie die Beispiele der Reihe nach durch.
1. 1 + 2 + 3 + 4 + 5 = 15
Die Zahlen 1 bis 5 werden zu 15 addiert. Das Programm gibt 15 aus und endet mit Exitcode 0.
5 4 + 3 + 2 + 1 + . \ 15
Erwarteter Exitcode: 0; Ausgabe-Prüfmuster (Regex): '15'
PBXB64.exe sum15-forth.forth -O2 -o example.exe .\example.exe $LASTEXITCODE
Nativ geprüft mit dem V22-Kandidaten vom 30.09.2026; Prüfung mit dem finalen Compiler noch ausstehend.
2. Stack umordnen: DUP, SWAP, OVER, ROT
DUP kopiert den obersten Wert; SWAP vertauscht die oberen zwei; OVER kopiert den zweitobersten; ROT dreht die oberen drei. . nimmt den obersten Wert und gibt ihn aus. 0 BYE beendet mit Exitcode 0.
1 2 DUP . . . CR 1 2 3 SWAP . . . CR 1 2 3 OVER . . . . CR 1 2 3 ROT . . . CR 1 2 2DUP . . . . CR 1 2 2DROP 99 . CR 0 BYE
Erwarteter Exitcode: 0
PBXB64.exe test_forth_stack.forth -O2 -o example.exe .\example.exe $LASTEXITCODE
Kanonischer Testfall mit erwartetem Ergebnis; hier keine neue native V22-Prüfung. Finale Ausführung noch ausstehend.
3. Ein eigenes Wort mit EXECUTE aufrufen
Die Definition : add+ + ; legt ein Wort an. 5 und 6 werden abgelegt; ' add+ erzeugt dessen Ausführungs-Token. EXECUTE ruft das Wort auf; . gibt die Summe 11 aus.
: add+ + ; 5 6 ' add+ EXECUTE . CR 0 BYE
Erwarteter Exitcode: 0
PBXB64.exe test_forth_execute_user.forth -O2 -o example.exe .\example.exe $LASTEXITCODE
Kanonischer Testfall mit erwartetem Ergebnis; hier keine neue native V22-Prüfung. Finale Ausführung noch ausstehend.
4. Das Maximum zweier Stackwerte
Ablauf Schritt für Schritt
- 2dup verdoppelt die beiden obersten Werte, ohne die Originale zu verlieren.
- > vergleicht das zweite mit dem obersten Stackelement; IF entfernt anschließend den kleineren Originalwert.
- 3 7 max2 lässt 7 auf dem Stack. BYE verwendet diesen Wert als Prozess-Exitcode.
: max2 2dup > if drop else swap drop then ; 3 7 max2 BYE
Erwarteter Exitcode: 7
PBXB64.exe forth-test_forth_if.forth -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
5. Eine Schleife mit Schrittweite zwei
Ablauf Schritt für Schritt
- 0 bildet den Summenstart; 10 0 DO setzt Grenze und Startindex.
- I liefert die Indizes 0, 2, 4, 6 und 8, weil 2 +LOOP die Schrittweite festlegt.
- Ihre Summe ist 20. . gibt sie aus; 0 BYE beendet mit Exitcode 0.
: step-sum 0 10 0 DO I + 2 +LOOP . ; step-sum 0 BYE
Erwarteter Exitcode: 0
Kanonisches Ausgabe-Prüfmuster (Regex)
20
PBXB64.exe forth-test_forth_plus_loop.forth -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
6. BEGIN/UNTIL prüft nach dem Schleifenrumpf
Ablauf Schritt für Schritt
- DUP . gibt den aktuellen Zähler aus, ohne seinen verbleibenden Wert zu verlieren.
- 1+ erhöht ihn; DUP 5 > prüft danach die Abbruchbedingung.
- Die sichtbaren Werte sind 0 bis 5. Der Wert 6 erfüllt die Abbruchprüfung und wird nicht mehr ausgegeben.
: count5 0 BEGIN DUP . 1+ DUP 5 > UNTIL ; count5 0 BYE
Erwarteter Exitcode: 0
Kanonisches Ausgabe-Prüfmuster (Regex)
012345
PBXB64.exe forth-test_forth_begin_until.forth -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
7. ?DO kann eine leere Schleife überspringen
Ablauf Schritt für Schritt
- 5 0 ?DO führt die Indizes 0 bis 4 aus.
- 5 5 ?DO beginnt bereits an der Grenze und führt keinen Schleifenrumpf aus.
- CR erzeugt in beiden Fällen einen Zeilenwechsel; der zweite Fall liefert nur die leere Zeile.
: test1 5 0 ?DO I . LOOP CR ; : test2 5 5 ?DO I . LOOP CR ; test1 test2 0 BYE
Erwarteter Exitcode: 0
Kanonisches Ausgabe-Prüfmuster (Regex)
01234
PBXB64.exe forth-test_forth_question_do.forth -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
8. Eine Summe rekursiv berechnen
Ablauf Schritt für Schritt
- DUP 0> entscheidet, ob ein positiver Wert vorliegt.
- RECURSE berechnet sumto für n - 1; + addiert den erhaltenen Wert zu n.
- Bei 0 entfernt DROP den Eingabewert und setzt 0 ein. Die Ausgaben sind 15 für 5 und 0 für 0.
: sumto DUP 0> IF DUP 1- RECURSE + ELSE DROP 0 THEN ; 5 sumto . CR 0 sumto . CR 0 BYE
Erwarteter Exitcode: 0
Kanonisches Ausgabe-Prüfmuster (Regex)
15 0
PBXB64.exe forth-test_forth_recursion_sum.forth -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
9. I und J in verschachtelten Schleifen
Ablauf Schritt für Schritt
- Die äußere Schleife verwendet 0, 1 und 2; die innere jeweils 0 und 1.
- I bezeichnet den inneren und J den äußeren Index.
- Die sechs Summanden I + J sind 0, 1, 1, 2, 2 und 3; insgesamt 9.
: nested-sum
0 3 0 DO
2 0 DO
I J + +
LOOP
LOOP
.
;
nested-sum
0 BYE
Erwarteter Exitcode: 0
Kanonisches Ausgabe-Prüfmuster (Regex)
9
PBXB64.exe forth-test_forth_nested_loops.forth -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
10. Werte auf dem Rückgabestack zwischenlagern
Ablauf Schritt für Schritt
- 1 2 3 legt drei Datenwerte ab; >R >R verschiebt 3 und dann 2 auf den Rückgabestack.
- R@ liest 2, ohne es zu entfernen. Die beiden R>-Aufrufe holen anschließend 2 und 3 zurück.
- Der ursprüngliche Wert 1 bleibt auf dem Datenstack. Ausgegeben werden 2, 2, 3 und 1.
: rs-demo 1 2 3 >R >R R@ . CR R> . CR R> . CR . CR ; rs-demo 0 BYE
Erwarteter Exitcode: 0
Kanonisches Ausgabe-Prüfmuster (Regex)
2 2 3 1
PBXB64.exe forth-test_forth_return_stack.forth -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
11. Die Tiefe des Datenstacks prüfen
Ablauf Schritt für Schritt
- 1 2 3 erzeugt drei Einträge.
- DEPTH liefert die Anzahl; . entfernt nur diesen neu erzeugten Zählwert.
- Nach drei DROP ist der Stack leer und die zweite DEPTH-Ausgabe ist 0.
: test-depth 1 2 3 DEPTH . CR DROP DROP DROP DEPTH . CR ; test-depth 0 BYE
Erwarteter Exitcode: 0
Kanonisches Ausgabe-Prüfmuster (Regex)
3 0
PBXB64.exe forth-test_forth_stack_introspection.forth -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
12. Ein Wort früh mit EXIT verlassen
Ablauf Schritt für Schritt
- DUP stellt eine Kopie des Eingabewerts für IF bereit.
- Ein von 0 verschiedener Wert nimmt EXIT, wobei der Originalwert erhalten bleibt.
- Bei Eingabe 0 entfernt DROP den Originalwert und legt 99 ab. Die zwei Aufrufe geben 5 und 99 aus.
: guarded DUP IF EXIT THEN DROP 99 ; 5 guarded . CR 0 guarded . CR 0 BYE
Erwarteter Exitcode: 0
Kanonisches Ausgabe-Prüfmuster (Regex)
5 99
PBXB64.exe forth-test_forth_exit.forth -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
Großes Beispiel: Mehrere Fallunterscheidungen als eigene Wörter
Ablauf Schritt für Schritt
- Vier Wörter kombinieren CASE, OF, ENDOF und ENDCASE; jedes erhält einen Auswahlwert vom Datenstack.
- Die Aufrufe prüfen passende Fälle und Standardpfade. Beispielsweise liefern die Fälle 1, 2 und 3 die Werte 10, 20 und 30.
- . gibt jeweils das Ergebnis aus, CR trennt die Zeilen. Der vollständige kanonische Ausgabevertrag zeigt auch die Standardpfade dieses PBXB64-Forth-Dialekts.
: case-value
CASE
1 OF 10 ENDOF
2 OF 20 ENDOF
3 OF 30 ENDOF
99
ENDCASE
;
: case-with-base
CASE
10 OF 1 ENDOF
16 OF 2 ENDOF
0
ENDCASE
;
: case-default-only
CASE
1 OF 100 ENDOF
42
ENDCASE
;
: case-multi-of
CASE
0 OF 1000 ENDOF
1 OF 1001 ENDOF
2 OF 1002 ENDOF
3 OF 1003 ENDOF
-1
ENDCASE
;
1 case-value . CR
2 case-value . CR
3 case-value . CR
4 case-value . CR
10 case-with-base . CR
16 case-with-base . CR
7 case-with-base . CR
0 case-default-only . CR
1 case-default-only . CR
0 case-multi-of . CR
1 case-multi-of . CR
2 case-multi-of . CR
3 case-multi-of . CR
4 case-multi-of . CR
0 BYE
Erwarteter Exitcode: 0
Kanonisches Ausgabe-Prüfmuster (Regex)
10 20 30 99 1 2 0 42 100 1000 1001 1002 1003 -1
PBXB64.exe forth-test_forth_case.forth -O2 -o example.exe .\example.exe $LASTEXITCODE
Ergebnisvertrag aus tests/validate.toml. Keine neue native Compilerprüfung in dieser Website-Erweiterung. Finale Ausführung mit dem freigegebenen Compiler steht aus.
Alle Quellen dieser Lernseite
Jedes Beispiel hat einen eigenen Ordner; die README nennt die jeweiligen Compileraufrufe. Enthaltene Includes behalten ihre passenden Pfade.
Alle 13 Beispiele als ZIPBridging
Die Stack-Konvention eines Forth-Worts ist nicht automatisch ein C- oder BASIC-Aufrufvertrag. Für gemeinsame native Module müssen die jeweiligen Symbol- und Typverträge ausdrücklich passen.
Vollständige Quellenpaare ansehen