Wenn man
x mit
y malnimmt, lautet das Ergebnis
y*x,
es sei denn, dass dabei eine
0 oder eine
1 beteiligt ist:
: MAL ( x y -- y*x ¦ x ¦ y )
OVER 0= OVER 1 = OR IF DROP ELSE
OVER 1 = OVER 0= OR IF NIP ELSE *
THEN THEN ;
Völlig richtig, es geht aber auch einfacher:
: MAL ( x y -- y*x ) * ;
Hiermit will ich demonstrieren, dass nicht immer,
wenn etwas eine Ausnahme zu sein scheint,
eine Sonderbehandlung dafür nötig ist.
Aber so einfach wie mit
MAL geht das natürlich nicht immer.
Im unten stehenden Programm habe ich so viele Sonderfälle
wie möglich dadurch beseitigt,
( **),
dass ich sie zu Normalfällen zurechtgebogen habe.
Es treten keine bedingten Sprünge mehr auf, und der Weg,
den das Programm durchläuft, kann dadurch leichter verfolgt werden.
Das einzige Zugeständnis ist
UNTIL am Ende von
SPIEL.
Forth file: gc206.frt
\ ----- Schiebespiel -----
\ Der Spieler schiebt die Steinchen
\ in die "richtige" Reihenfolge.
MARKER -SPIEL
: CHAR-ARRAY ( anzahl <name> -- ) \ Definierendes Wort
CREATE C,
HERE 1- C@ 1+ ALLOT ALIGN \ Max. Laenge? ( **)
DOES> ( nr -- adr )
COUNT ROT UMIN + ; \ Range? ( **)
16 CHAR-ARRAY BRETT \ 15 Zeichen und ein leeres Feld
0 VALUE HIER \ Leerfeldposition (Zwischenraum)
: ENDSTAND ( -- )
S" VIJGEBLAD*FORTH " 0 BRETT SWAP MOVE
15 TO HIER ;
\ Anm. d. Uebers.:
\ VIJGEBLAD = Vereinszeitschrift der Forth-gebruikersgroep,
\ der niederlaendischen Forth-Gesellschaft.