Forth-Quelltextfür die Verkehrsampel-Lexion
[Klicken Sie
hier, um zum Lehrtext zurückzukehren.]

Forth-Worte müssen erst erzeugt werden ( unter Verwendung von : ... ; ), bevor sie angewandt werden können. Sie werden also das Wort TRAFFIC-LIGHT, das eigentlich das gesamte Programm darstellt, erst ganz am Ende vorfinden.

"\" steht am Anfang eines Kommentars. Forth überspringt dann den Rest der Zeile.

Neue Worte werden wir in Fettschrift darstellen. Unmittelbare Kommandos an Forth im Quelltext fassen wir kursiv.

Dieses Programm benutzt einige WebForth-Worte, welche hier erklärt werden.
Ein vollständiges Glossar aller in WebForth auftretenden Worte steht ebenfalls zur Verfügung.


 CR .( Traffic Lights wird geladen ) CR        \ Meldung bei Einladen des Quelltextes
                                               \ CR beginnt eine neue Zeile auf dem Bildschirm

 \ Variablen vereinbaren,     Anfangswerte setzen
 VARIABLE     RED-WAIT    10    RED-WAIT !     \ 20 Zehntel = 2 Sekunden
 VARIABLE  YELLOW-WAIT    10 YELLOW-WAIT !     \ 10 Zehntel = 1 Sekunde
 VARIABLE   GREEN-WAIT    20  GREEN-WAIT ! 

 VARIABLE  %WAIT   100 %WAIT !                 \ Verwende 100, um 1 <sec/sec> nachzuahmen

 : ESC?          ( -- EscGedrueckt  )          \ TRUE, wenn Esc-Taste gedrückt
                 KEY? IF                       \ Wurde eine Taste gedrückt? 
                   KEY 27 =                    \ Erkunde, ob es die Esc-Taste ist oder nicht
                 ELSE FALSE THEN               \ andernfalls liefere FALSE
 ; 
 : WAIT          ( Zehntel -- )                \ Zehntel einer Sekunde lang warten
                 CR CR %WAIT @ * MS            \ MS wartet 1 Millisekunde lang
                 ESC? ABORT" Esc gedruckt"
 ; 
 : COLOR-SPACES  ( X Y Zwischenräume Farbe -- )
                 BG-CLR @ >R                   \ Hintergrundfarbe aufbewahren,
                 BG-CLR !                      \ dann auf Farbe setzen.
                 ROT ROT AT-XY                 \ Cursor auf die Position X,Y setzen.
                 SPACES                        \ Zwischenräume in der Hintergrundfarbe setzen
                 R> BG-CLR !                   \ und dann wiederherstellen.
 ;

 COLS @ 2/       \ Bildschirmmitte berechnen
 1- CONSTANT  X  \ Die Verkehrsampel beginnt X Zwischenräume vom Rand entfernt
  5 CONSTANT  Y  \ Die oberste Lampe beginnt Y Zwischenräume vom oberen Rand entfernt

 : LAMP          ( Y -- )
                     X OVER  4 GRAY COLOR-SPACES       \ wie in XXXX
                 1 + X OVER  4 GRAY COLOR-SPACES       \        XXXX
                 1 + X SWAP  4 GRAY COLOR-SPACES       \        XXXX
;
 : LENS          ( Y Farbe -- )
                 X 1 + ROT ROT  2 SWAP COLOR-SPACES    \ wie in  OO
 ; 
 : POST          ( Y -- )
                     X 1 + OVER  2 GRAY COLOR-SPACES   \ wie in XXXX
                 1 + X 1 + OVER  2 GRAY COLOR-SPACES   \         XX
                 1 + X 1 + SWAP  2 GRAY COLOR-SPACES   \         XX
 ; 
 : LAMP-&-POST   ( -- )                                \ wie in XXXX
                 PAGE          \ Löscht den Bildschirm \        XOOX
                 Y     LAMP  Y 1 + DARK-RED    LENS    \        XXXX
                 Y 2 + LAMP  Y 3 + DARK-YELLOW LENS    \        XOOX
                 Y 4 + LAMP  Y 5 + DARK-GREEN  LENS    \        XXXX
                 Y 7 + POST                            \        XOOX
                 0 0 AT-XY                             \        XXXX
 ;                                                     \         XX
                                                       \         XX
                                                       \         XX
\ Helle Leuchtfläche zeigen, etwas warten und Leuchtfläche dann wieder abdunkeln.
 : RED           ( -- )
                 Y 1 +  RED LENS       \ Leuchtfläche in heller Farbe zeichnen
                 RED-WAIT @ WAIT      
                 Y 1 +  DARK-RED LENS  \ Leuchtfläche noch einmal in dunkler Farbe zeichnen
                 CR
 ;
 : RED-&-YELLOW  ( -- )
                 Y 1 +       RED LENS  Y 3 +       YELLOW LENS
                 YELLOW-WAIT @ WAIT
                 Y 1 +  DARK-RED LENS  Y 3 +  DARK-YELLOW LENS
                 CR
 ; 
 : YELLOW        ( -- )
                 Y 3 +  YELLOW LENS
                 YELLOW-WAIT @ WAIT
                 Y 3 +  DARK-YELLOW LENS
                 CR
 ; 
 : GREEN         ( -- )
                 Y 5 +  GREEN LENS
                 GREEN-WAIT @ WAIT
                 Y 5 +  DARK-GREEN LENS
                 CR
 ; 

\ Wort, das die Verkehrsampel aufbaut und eine Meldung an den Anwender absetzt
 : LAMP-POST     ( -- )
                 LAMP-&-POST
                 ." Programm verlassen uber die Esc-Taste" CR
 ;

 \ Jetzt das Wort von eben ausführen
 LAMP-POST 

\ ( Verkehrsampel-Beispiel - vom Benutzer einzugebende Worte )
\  : PHASES  ( -- )
\        RED RED-&-YELLOW GREEN YELLOW
\  ;
\  : TRAFFIC-LIGHT  ( -- )
\        LAMP-POST BEGIN PHASES AGAIN
\  ;
[ Lehrtext | Anfang ] Copyright © WebForth-Team 2001