|
| ||||
|
Interpreteren en compileren |
Als je interactief in Forth aan het werk bent, zit je in een lus die er
ongeveer zo uitziet:
: QUIT BEGIN Accepteer-input-van-het-toetsenbord BEGIN READEVAL Is-alle-input-afgehandeld? UNTIL AGAIN ;In een plaatje: waarin READEVAL er zo uitziet: : READEVAL Pak-het-volgende-woord-uit-de-input Zoek-zijn-sleutel Gevonden? IF EXECUTE EXIT THEN Is-het-misschien-een-getal? IF Zet-het-op-stack EXIT THEN ERROR ;EXIT ( -- ) Verlaat de definitie. Maar de Forth interpreter is tegelijkertijd de Forth compiler. Forth houdt bij of hij in de interpret toestand (state=0) of in de compiletoestand (state<>0) zit. : READEVAL Pak-het-volgende-woord-uit-de-input Zoek-zijn-sleutel Gevonden? IF STATE @ IF Compileer-het EXIT \ *** THEN EXECUTE EXIT THEN Is-het-misschien-een-getal? IF STATE @ IF Compileer-het EXIT \ *** THEN Zet-het-op-stack EXIT THEN ERROR ; De QUIT met daarin deze READEVAL vormt de interpreter en compiler van Forth. Dat is dus een heel eenvoudige zaak. |
: en ; |
Nu wordt ook duidelijk wat «:» zal moeten doen: Een header aanmaken en het systeem in de compileertoestand zetten. Als het nieuwe woord later uitgevoerd wordt, zorgt zijn Doer er op zijn beurt voor dat de gecompileerde lijst achter de header uitgevoerd wordt. : : CREATE TRUE STATE ! DOES> Voer-de-gecompileerde-woorden-uit ;Er is nog een probleempje, want hoe is het nu mogelijk om de compileertoestand te verlaten als hij eenmaal aangezet is? Om STATE weer op nul te zetten moet er een woord uitgevoerd worden dat dat doet, maar alle woorden worden gecompileerd, dus dat lukt niet meer. De oplossing is dat het mogelijk is om woorden te 'merken' met het stempel IMMEDIATE. IMMEDIATE woorden worden altijd uitgevoerd, ook als Forth in de compileertoestand verkeert. READEVAL moet dus nog iets aangepast worden om deze woorden te kunnen herkennen: : READEVAL Pak-het-volgende-woord-uit-de-input Zoek-zijn-sleutel Gevonden? IF STATE @ Niet-immediate? AND \ *** IF Compileer-het EXIT THEN EXECUTE EXIT THEN Is-het-misschien-een-getal? IF STATE @ IF Compileer-het EXIT THEN Zet-het-op-stack EXIT THEN ERROR ;Nu de punt-komma. Die moet natuurlijk immediate zijn. Hij compileert exit en schakelt terug naar de interactieve toestand: : ; ( -- ) Compileer-EXIT 0 STATE ! ; IMMEDIATEDe punt-komma is een compilerend woord.
|
1. Rekenen in Forth |
2. Programmeren in Forth |
3. Definiėrende woorden |
4. Compilerende woorden |