[Allegro] Trick 31: FLEXe verschachteln
Bernhard Eversberg
ev at biblio.tu-bs.de
Mo Dez 18 08:47:36 CET 2006
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.
Nachteil: höchstens bei sehr großen FLEXen eine Einbuße an
Leistung. Der interne Speicher für die auszuführende FLEX-Datei
ist 64K gross, 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 heisst, 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.
Mehr Informationen über die Mailingliste Allegro