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 |