Implementation eines Unterprogramms
#proc <Name> [$<Argname1> [$<Argname2> [...]]]
Dieser Metabefehl ermöglicht es eigene Unterprogramme zu schreiben, die dann in der Zugvorlage (oder anderen Unterprogrammen) verwendet werden können. Es können mehrere Parameter festgelegt werden die dem Unterprogramm dann beim Aufruf als Variable übergeben werden.
Soll ein Parameter von dem Unterprogramm aus verändert werden können, so muß dieser im Unterprogramm durch ein 'Kaufmanns-Und' gekennzeichnet werden (z.b. &$Argname ). Eine Zuweisung an diese Variable (benutzt wird sie in dem Unterprogramm ohne das Kennzeichen) verändert dann den Parameter im #call-Aufruf der Vorlage.
ACHTUNG: Vorlage unterstützt keine echten Referenzen, so das dieses Feature in erster Linie dazu gedacht ist um Parameter aus Aufrufen in der Zugvorlage zu verändern).
Eine Prozedur kann an beliebiger Stelle mittels #return verlassen werden.
Prozeduren werden genauso wie Funktionen in eine externe Skript-Datei geschrieben und diese beim Aufruf von Vorlage mit der Option '-i' eingebunden. Sie können nicht direkt in der Zugvorlage geschrieben werden.
Man kann im Kopf der Prozedur durch anhängen von drei Punkten (...) erreichen, das auch mehr Parameter als vorgegeben verwendet werden dürfen. Gibt man nur drei Punkte an, so ist die Prozedur bereits ohne Parameter aufrufbar, aber es können beliebig viele übergeben werden.
Alle Parameter eines Prozedur-Aufrufes stehen nicht nur in den benannten Parameter-Variablen, sondern auch in einem feldartigen Spezialobjekt namens ARG . Die Anzahl der Parameter mit der eine Prozedur aufgerufen wurde steht dabei in ARG.SIZE und die Parameter selber in ARG[] für von 0 bis ARG.SIZE-1 .
Veränderliche Referenzvariable (die im Prozedurkopf ein & vor dem Parameternamen haben) können auch zuweisend über ARG verändert werden.
ACHTUNG: Der interne Mechanismus erfordert (noch), das die #proc-Zeile alleine steht und die '{' des Unterprogrammes in der nächsten Zeile. Es gibt also keine Einzeiler-Prozeduren.
Gegeben sei ein Unterprogramm:
#proc Holzfaeller $Bestand
{
$h=region.baeume-$Bestand
#if $h>0 { MACHE $h Holz } else { LERNE Holzfaellen }
}
Dann kann es wie folgt genutzt werden:
EINHEIT f00; Die Holzer [5,150$] hinten
// #call Holzfaeller 600
; Eine Runde noch ohne Automatisierung holzen:
MACHE Holz
Das ergibt z.b. bei einem Baumbestand von 630 in der Region in der nächsten Vorlage:
EINHEIT f00; Die Holzer [5,100$] hinten
// #call Holzfaeller 600
MACHE 30 Holz
#call, #func, #return Revision 22 Jul 2003
|