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.