This page (revision-21) was last changed on 03-Feb-2023 15:21 by Carsten Strotmann 

This page was created on 29-Jul-2010 13:57 by Carsten Strotmann

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
21 03-Feb-2023 15:21 27 KB Carsten Strotmann to previous

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 328 added 71 lines
Mit dieser CASE-Anweisung läßt sich die Zuordnung der sechs Möglichkeiten zu den sechs Anweisungen ähnlich wie in PASCAL schreiben, lediglich Bereiche wie 0..255 als Fall-Konstanten sind nicht erlaubt.
{{{
: Auswertung.5 ( Wurfergebnis -- )
CASE
1 OF nehmen ENDOF
2 OF links schieben ENDOF
3 OF links schieben ENDOF
4 OF rechts schieben ENDOF
5 OF rechts schieben ENDOF
6 OF trinken ENDOF
ELSECASE
invers ." Betrug!" normal
ENDCASE ;
}}}
Das vollständige Programm kann so geschrieben werden, wobei die typische drei­teilung "Eingabe-Verarbeitung-Ausgabe" deutlich wird:
{{{
: craps ( -- )
cr Anfrage cr
input#
Auswertung
cr Glückwunsch
;
}}}
Wil Baden hat in "[Ultimate CASE Statement]" ausgeführt, das eine CASE-Anweisung nur syntaktischer Zucker für ein Programm ist und letztendlich nichts weiter ist, als das Kompilieren einer verschachtelten IF...THEN-Anweisung. Eine solche Implemetierung fur das volksFORTH83 wurde von Herrn Klaus Schleisiek geschrieben:
{{{
\ CASE OF ENDOF ENDCASE
: CASE ( n1 -- n1 n1 ) dup ;
: OF [compile] IF compile drop ; immediate restrict
: ENDOF [compile] ELSE 4+ ; immediate restrict
: ENDCASE compile drop BEGIN 3 case? WHILE >resolve REPEAT ; immediate restrict
}}}
Wil Badens Implementierung hält sich sehr eng an die logischen Grundlagen, wobei der Unterschied zum EAKER-CASE hauptsächlich darin besteht, daß hier jedes TRUE-Flag den Anweisungsteil zwischen OF und ENDOF ausführt; das OF nimmt keine Prüfung auf Gleichheit vor, sondern beliebige Ausdrücke können zu einem Flag führen, das dann von OF ausgewertet wird. So ist das Auswerten des Fall­ Index variabler als beim EAKER-CASE:
{{{
: Auswertung.6 ( Würfenwurf -- )
dup
1 6 between not
IF invers ." Betrug!" normal drop exit THEN
CASE 1 = OF nehmen ENDOF
CASE 6 = OF trinken ENDOF
CASE 4 < OF links schieben ENDOF
CASE 3 > OF rechts schieben ENDOF
ENDCASE ;
}}}
Hier bei dieser Konstruktion steht die Plausibilltätsprüfung ganz vorn, um den ELSECASE-Fall durch ein EXIT aus dem Wort zu erreichen. Wird keines der Worte aus der Auswahl-Liste ausgeführt, läßt sich mit BREAK eine andere Lösung erreichen:
{{{
: BREAK compile exit
[compile] THEN ; immediate restrict
}}}
Dadurch, daß BREAK ein EXIT aus dem Wort darstellt, wird ein (implizites) ELSECASE erreichen, indem man die Anweisungen der Auswahl-Liste mit OF und BREAK klammert und die Anweisungen für den ELSE-Fall nach ENDCASE aufführt:
{{{
: Auswertung.7 ( Würfelzahl -- )
CASE 1 = OF nehmen BREAK
CASE 2 = 3 =or OF links schieben BREAK
CASE 4 = 5 =or OF rechts schieben BREAK
CASE 6 = OF trinken BREAK
ENDCASE invers ." Betrug!" normal ;
}}}
! Positionelles CASE