210b
<< <> >>

Forthprogrammeur aan het werk

: MANY ( -- ) >IN @ STOP? AND >IN ! ;
Ho, wacht even, STOP? is geen standaard Forthwoord. Daar gaan we dus eerst even op in.
Forth file: c210.frt

FORTH DEFINITIONS   DECIMAL
: 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] ?
Levert nul op. Maar voer dezelfde regel nog eens in, en druk onmiddellijk na [rtn] op een of andere toets. Drie mogelijkheden:
  1. Je drukt op [Esc]: Forth protesteert en reageert met een foutmelding.
  2. Je drukt op een andere toets, geen [Esc] maar ook geen[Spatie]: Forth drukt -1 (TRUE) af.
  3. Je drukt op [Spatie]: Forth pauzeert, stopt alle actie, en wacht op nog een toets. Wordt dat weer een [Spatie] dan is het resultaat 0 (FALSE). Na [Esc] komt er weer protest en de overige toetsen leveren -1 (TRUE).
Dit klinkt ontzettend ingewikkeld, maar als je het een paar keer uitprobeert wordt het gauw heel logisch. STOP? (geen standaard Forthwoord dus) zit vaak in woorden als WORDS, SEE, DUMP, woorden die tekst produceren die van het scherm af kan lopen. Met STOP? heb je de mogelijkheid om de zaak even stil te zetten of af te breken.
: MANY ( -- ) >IN @ STOP? AND >IN ! ;
Zolang STOP? hier nul oplevert, wordt >IN nul gemaakt: Forth wordt om de tuin geleid, 'denkt' steeds dat hij nog niets van de regel gelezen heeft en begint steeds weer vooraan de regel.

Met MANY kun je interactief lusjes maken:
) 888 . MANY DROP [rtn] ?
Tamelijk zinloos, maar:
) BL [rtn]
) DUP EMIT 1+ MANY DROP [rtn] ?
>>