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
Aktualizováno dne 20000704. Komentář: info@jlabs.cz