210b
<< <> >>

Forthprogrammierer ans Werk

: MANY ( -- ) >IN @ STOP? AND >IN ! ;
Halt, warte noch einen Moment! STOP? ist kein Standard-Forthwort. Darauf müssen wir erst noch schnell eingehen.
Forth file: gc210.frt 

: STOP? ( - true/false )
  KEY? DUP IF DROP KEY
     BL OVER = IF DROP KEY THEN
     27 OVER = IF -28 THROW THEN
     BL <> THEN ;

) 1000 MS STOP? . [rtn] ?
liefert Null. Aber gib dieselbe Zeile noch einmal ein und drück unmittelbar nach [rtn] auf irgendeine Taste. Drei Möglichkeiten.
  1. Du drückst auf [Esc]: Forth protestiert und reagiert mit einer Fehlermeldung.
  2. Du drückst auf eine andere Taste, kein [Esc], aber auch kein [Zwischenraum]: Forth zeigt -1 (TRUE) an.
  3. Du drückst auf [Zwischenraum]: Forth macht Pause, hält mit allen Aktionen inne und wartet auf eine weitere Taste. Wird das wieder ein [Zwischenraum], dann ist das Ergebnis 0 (FALSE). Nach [Esc] kommt wieder Protest und die übrigen Tasten liefern -1 (TRUE).
Das klingt schrecklich kompliziert, aber wenn du es ein paar Mal ausprobiert hast, wird es ganz schnell logisch. STOP? (kein Standard-Forthwort also) sitzt häufig in Worten wie WORDS SEE DUMP, Worte, die Text erzeugen, welcher am Bildschirm durchlaufen kann. Mit STOP? hast du die Möglichkeit, das Durchlaufende mal kurz anzuhalten oder auch ganz abzubrechen.
: MANY ( -- ) >IN @ STOP? AND >IN ! ;
Solange STOP? hier Null liefert, wird >IN auf Null gesetzt: Forth wird hinters Licht geführt, 'denkt' fortwährend, noch nichts von der Zeile gelesen zu haben, und fängt die Zeile stets wieder von vorn an.

Mit MANY kannst du interaktive Schleifen herstellen:
) 888 . MANY DROP [rtn] ?
Ziemlich sinnlos, aber:
) BL [rtn]
) DUP EMIT 1+ MANY DROP [rtn] ?
>>