211c
<< <> >>
 
Theo: Nu beschikken we over FFBASE waarmee je heel eenvoudig en kort voor elk gewenst grondtal zo'n HX-achtig woordje kunt definiëren. De (algemene) actie voor die woordjes staat achter DOES> en de C@ aan het begin van die actie leest het (betreffende) tijdelijke grondtal uit de body van het woordje.
Het is jammer, maar in bepaalde omstandigheden zal dit niet bevredigend werken. Zo gaat het nu altijd als je aan het programmeren bent. Probeer eens te ontdekken wanneer het niet goed zal gaan. Je krijgt een hint.
De Interpreter verwerkt drie soorten woorden: gewone woorden, immediate woorden en getallen. De Interpreter kan in twee toestanden verkeren: interactief en compilerend.
Dat zijn 6 mogelijkheden en met één van die mogelijkheden is er iets aan de hand. Zoek dat maar eens uit.

Twee dagen later

Leo: Ik zag gisteren pas waarom je dat woord FFBASE hebt genoemd! En ik heb ontdekt wat er mis is. We hebben het nog niet over compileren gehad, maar in een definitie levert
:  ... HX . ... ;
niks op. Er gaat niets verkeerd, maar er gebeurt ook niets. HX heeft geen effect en ik begrijp ook waarom, want het maakt natuurlijk niet uit wat het grondtal is tijdens het compileren van die punt. Met getallen gaat alles goed. Je moet nu dus nog iets verzinnen waardoor HX ook vat krijgt op een Forth-woord dat gecompileerd wordt. Dat lukt je vast wel.
 
Theo: Natuurlijk kan dat. De code groeit er goed van.
: (BASE) ( token tempbase -- )
  BASE @ >R                \ Save grondtal
  BASE !                   \ Tijdelijk grondtal
  EXECUTE                  \ Actie
  R> BASE ! ;              \ Herstel grondtal

: FFBASE ( tempbase ccc -- )
  CREATE C, ALIGN IMMEDIATE
  DOES> C@                 ( tempbase )
  BL WORD DUP FIND
  S>D STATE @ AND          \ Compileren?
  IF DROP NIP SWAP         ( xt tempbase )
     POSTPONE 2LITERAL     ( tempbase x )
     POSTPONE (BASE)
     EXIT
  THEN
  IF NIP SWAP (BASE) EXIT  \ Executeren
  THEN DROP SWAP           ( word tempbase )
  BASE @ >R                \ Save grondtal
  BASE !                   \ Tijdelijk grondtal
  COUNT EVALUATE           \ Getalinvoer
  R> BASE ! ;              \ Herstel grondtal
>>