Trick 31 : FLEX-Verschachtelung

Immer mal wieder wird gewünscht, aus einem FLEX heraus einen
zweiten aufrufen zu können, aber so, daß es nach dessen Ende
im selben FLEX weitergeht.
Mit dem Befehl

exec zweit
:weiter

wird zwar  zweit.flx  gestartet, aber wenn der endet, geht
es nicht mit der Zeile  :weiter  weiter, sondern gar nicht,
weil zweit.flx eben nicht automatisch zurückkehrt. (Der FLEX-
Aufruf ist, programmiertechnisch gesagt, nicht rekursiv.)

Es gibt zwei Tricks, um diesem scheinbaren Mangel abzuhelfen:

1. include
Man bindet den aufzurufenden FLEX einfach mit ein, und zwar so:

include zweit.flx
:weiter

Dann verhält es sich so, als stünde der gesamte Text des
FLEXes zweit.flx an der Stelle, wo "include..." steht.
Wenn zweit.flx so gestaltet ist, daß er bis zu seinem Ende
läuft und dort kein Befehl "end" steht, geht es dann zwanglos
mit der Zeile  :weiter  weiter.
Nachteile:
1. Gefahr, daß in zweit.flx Sprungmarken vorkommen, die es auch
in erst.flx gibt - dann passieren Fehler.
2. höchstens bei sehr großen FLEXen eine Einbuße an
Leistung. Der interne Speicher für die auszuführende FLEX-Datei
ist 64K groß, dabei zählen Kommentare nicht mit. Das ist eine
Menge. Der längste mitgelieferte FLEX ist files.flx mit 18K,
aber inclusive Kommentare!


2. Rückaufruf des ersten FLEXes
Nichts spricht dagegen, in einem aufgerufenen FLEX einen weiteren
exec-Aufruf unterzubringen, um den ersten wieder fortzusetzen.
Das könnte etwa so aussehen:
Wenn der aufrufende FLEX etwa  erst.flx  heißt, schreiben wir
oben an den Anfang

  zuerst die Variable #urC löschen!
#urC
ins #urC     // iV-Inhalt in #urC speichern
var #urC     // pruefen, ob das mit "jump" anfaengt
if "jump" var #urC(b"jump ");jump
...   // beliebiger Inhalt
exec zweit.flx first;weiter
:weiter

Und in den aufgerufenen  zweit.flx  schreiben wir rein:

#urC
ins #urC
if #urC jump start
:anfang
  Normaler Anfang
...
:start
  hier anfangen, wenn mit  exec xyz  aufgerufen
...
:rueck
var #urC(e";") " jump " #urC(b";")
exec


Wenn die Zeile  :rueck  erreicht wird, erfolgt der Rücksprung zu
erst.flx, wo die zurückgegebene Sprungmarke verwertet wird, um dann
dorthin zu springen. Der Aufruf lautet dann in Wirklichkeit
   exec jump weiter
FLEXologen erkennen leicht, wie sie dies Schema weiter aufbohren
können, um die Sache weiter zu FLEXibilisieren.
Die Variable #urC sollte selbstredend nicht zugleich irgendwo für
andere Zwecke verwendet werden.

Die Übergabe von Werten ist natürlich immer auch mit Variablen
möglich,  die hier gezeigte Methode ist nur eine von vielen
denkbaren Varianten.
Nachteile:
1. Etwas umständlicher
2. Die Variable #urC könnte zufällig doch einmal für
andere Zwecke irgendwo benutzt werden, d.h. es könnte eine Neben-
wirkung geben.