VaxNt/ProDB.PGuide.Řídící příkazy
Novinky z 20010204:
Řídící příkazy slouží k ovládání běhu programu, rozhodování, volání a ukončování procedur. Skriptovací jazyk VaxNt obsahuje všechny tyto konstrukty, syntax je přizpůsobena řádkovému formátu a maximální rychlosti interpretace. Opět platí, že typický skript je jenom několik řádků a tudíž není potřeba žádný zvláštní syntatický cukr. Řídící konstrukty jsou konkrétně následující:
Rozhodování. Rozhodování má formát "if-then" resp. "if-then-else" se stejným významem, jako například v Pascalu. Formát podmínky za "if" je přizpůsoben syntakticky rychlému vyhodnocení zleva doprava a je v prefixní notaci. Atomární podmínky jsou přizpůsobeny kontextu skriptů a vedle aritmetických operátorů obsahují i operátory řešící viditelnost položek v aktuálním zobrazení apod.
Syntax je následující
if podminka then prikaz [ else prikaz ] - musí ale být na jednom řádku.
Příkazy mohou být libovolné, podmínka má syntax:
Na příkaz if se vztahují všechny konvence s vykřičníkovou a dolarovou notací. Je tedy možno použít "ďábelské" konstrukce tvaru "if !@$(P) infix $(A)$(B)nobody then ... ". Interpretace if-příkazu postupje tak, že se nejprve vyhodnotí podmínka. Pokud platí, z aktuálního řádku se izoluje obsah mezi then a else res. koncem řádku, když else není přítomno. Již vyexpandovaný a sunstituovaný úsek řádku nahradí dočasně aktuální řádek skriptu a rovnou se jím pokračuje. Pakliže ale podmínka neplatí, provede se totéž s úsekem za else. Pokud není, provede se příkaz "nop" a tím je interpretace hotova.
Příklad: set i,2 repeat _call !Zpracovani,X=$(i) inc i until i = 72
Příklad: for i,2,72 _call !Zpracovani,X=$(i) endfor
Příklad: set i,2 repeat _call !Zpracovani,X=$(i) inc i if @X = Chyba then break until i = 72
Příklad: set i,2 unless on repeat _call !Zpracovani,X=$(i) break unless @X <> Chyba inc i until i = 72
Skoky na návěští mají následující syntax:
Varianty skoků: Funkce ArgList Popis ------------------------------------------------------------------------------------------------------------- goto Label pokračuje se na řádku Label: jump Label jenom synonymum pro goto Label taktéž s nostalgickou vzpomínkou na stařičký BASIC jump.podminka Label velké množství odvolávající se na _PreviousResult nebo explicitní aritmetické operátory, jedná se o obsolentní formy pro milovníka assembleru, někdy ale dovolí stručnější zápis ... ------------------------------------------------------------------------------------------------------------- Příklady ======================================================= wizard X jump.iffalse Konec ... ======================================================= if @A = void then goto Quit if @B = void then jump Quit if @C = void then Quit ======================================================= if or,@A = void,@B = void,@C = void then Quit ======================================================= jump.ifeq A,1,Start jump.ifne B,4,Konec =======================================================
Volání / návrat podskriptů call, call.args a return
Varianty: Funkce ArgList Popis ------------------------------------------------------------------------------------------------------------- call Prg volání podřízeného skriptu, jeho text se hledá v adresáři params/prg a je-li zapnuto chacheování, pak v heapu VaxNt.Exe. Skriptu Prg je předána přes CallingContext kopie Context aktuálního skriptu. call.args Prg,N=V,N=V dtto, ale ještě před voláním se sestrojí pár rovnic, umožní stručnější syntax return volajícímu skriptu jsou do jeho Context přes ReturnedContext předány všechny neprázdné hodnoty z Context právě končícího skriptu exit ukončí běh podřízeného skriptu bez předání jakéhokoli výsledku ------------------------------------------------------------------------------------------------------------- Příklady: ======================================================= call.args uzaverka.prg,Mesic=200001,Zacatek=A call.args uzaverka.prg,Mesic=200002,Zacatek=N call.args uzaverka.prg,Mesic=200003,Zacatek=N,KonecKvartalu=A call.args kvartal.prg,Kvartal=2000.1Q =======================================================
Volání / návrat procedur uvnitř skriptu _call a _return
Varianty: Funkce ArgList Popis ------------------------------------------------------------------------------------------------------------- _call Label,N=V,N=V,... volání procedury v rámci skriptu, volá se přers zásobník návratových adres, možno až 32 vnořených volání. Pokud nedojde při exekuování k přetečení, je možno v případě potřeby ukončovat i pomocí goto, ale není to vhodná metoda ... Zásobník, stejně jako celý virtuální stroj VaxNt dostává každý skript při startu vždy "čistý", tedy různé drobné chyby a pozůstatky běhu jiných skriptů jsou vždy zničeny. _return návrat za místo volání _call. ------------------------------------------------------------------------------------------------------------- Příklady: ======================================================= _call SetUp _call HlavickaSestavy _call Vypis,Zavod=JC,Nazev=JČ _call Vypis,Zavod=JM,Nazev=JM _call Vypis,Zavod=PH,Nazev=PH _call Vypis,Zavod=SM,Nazev=SM _call Vypis,Zavod=VC,Nazev=VČ _call Vypis,Zavod=ZC,Nazev=ZČ =======================================================
Ukončení exekuování skriptu exit a exit.*
Varianty: Funkce ArgList Popis ------------------------------------------------------------------------------------------------------------- exit V ukončuje interpretace skriptu, hodnota V má smysl 0,1,2 a označuje míru refreshe pohledu, nad kterým byl skript volán. Default - žádná hodnota nebo 2- znamená úplný refresh pohledu s nasátím z databáze. 0 znamená žádný refresh a 1 znamená refresh pouze aktuálního řádku. Skript podle své povahy jednoduše buď databázi ovlivní globálně, pak je vhodný úplný refresh, nebo málo - refresh řádku a konečně vůbec, třebas při výpočtu nějaké sestavy. Vhodnou technikou je nechat ale pohled refreshovat vždycky úplně, operátor má tam zdarma vždycky po ukočení každého scénáře aktuální pohled ... exit.iffalse varianta jump.iffalse, předčasné ukončení skriptu. -------------------------------------------------------------------------------------------------------------
Příkazy switch a ifsome
Rejstřík kapitoly
Nadřízená kapitola dokumentace / rejstřík