211c
<< <> >>
 
Theo: Nun verfügen wir mit FFBASE über ein Wort, mit welchem wir ganz einfach und kurz zu jeder gewünschten Basiszahl so'n HX-artiges Wort definieren können. Die (allgemeine) Aktion dieses Wortes steht hinter DOES> und das C@ am Anfang der Aktion liest die (betreffende) momentane Basiszahl aus dem Body des Wortes aus.
Es ist jammerschade, aber in bestimmten Situationen funktioniert das nicht zufrieden stellend. So geht es einem immer wieder, wenn man sich ans Programmieren macht. Versuch mal herauszubekommen, wann es nicht geht. Ich gebe dir einen Hinweis.
Der Interpreter verarbeitet drei Sorten von Worten, gewöhnliche Worte, Immediate-Worte und Zahlen. Der Interpreter kann sich in zwei Zuständen befinden, interaktiv und compilierend.
Das sind 6 Möglichkeiten und mit einer davon stimmt was nicht. Finde das mal heraus.

Zwei Tage später

Leo: Ich bin gestern dahinter gekommen, warum du das Wort FFBASE genannt hast! Und ich habe entdeckt, was daran nicht stimmt. Wir haben uns noch nicht über das Compilieren unterhalten, aber in einer Definition liefert
:  ... HX . ... ;
nix. Es geht dabei nichts schief, aber es passiert auch nichts. HX zeigt keine Wirkung und ich begreife auch, warum. Es ist nämlich völlig ohne Bedeutung, welche Basiszahl beim Compilieren des Punktes eingeschaltet ist. Mit Zahlen geht alles gut. Du musst dir also noch etwas ausdenken, damit HX auch solchen Forth-Worten beikommt, die compiliert werden. Das gelingt dir sicher auch noch.
Theo: Natürlich geht das. Der Code wächst damit gut.
Forth file: gc211.frt 

: (BASE) ( token tempbase -- )
  BASE @ >R                \ Bewahre Basiszahl auf
  BASE !                   \ Temporaere Basiszahl
  EXECUTE                  \ Aktion
  R> BASE ! ;              \ Stelle Basis wieder her

: FFBASE ( tempbase ccc -- )
  CREATE C, ALIGN IMMEDIATE
  DOES> C@                 ( tempbase )
  BL WORD DUP FIND
  S>D STATE @ AND          \ Compilieren?
  IF DROP NIP SWAP         ( xt tempbase )
     POSTPONE 2LITERAL     ( tempbase x )
     POSTPONE (BASE)
     EXIT
  THEN
  IF NIP SWAP (BASE) EXIT  \ Ausfuehren
  THEN DROP SWAP           ( word tempbase )
  BASE @ >R                \ Bewahre Basiszahl auf
  BASE !                   \ Temporaere Basiszahl
  COUNT EVALUATE           \ Zahleneingabe
  R> BASE ! ;              \ Stelle Basis wieder her
>>