: 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:
- Je drukt op [Esc]: Forth protesteert en reageert met een foutmelding.
- Je drukt op een andere toets, geen [Esc] maar ook geen[Spatie]:
Forth drukt -1 (TRUE) af.
- 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] ?