JLABS

VaxNt/ProDB.PGuide.Řídící příkazy

Programátorská příručka.Řídící příkazy

Bullet Novinky z 20010204:


Bullet Nepovinná podmínka pro přeskočení řádku - unless.
Bullet Cykly typu repeat-until.
Bullet Cykly typu for-endfor.
Bullet Implicitní ukončování cyklů pomocí break.
Bullet

Bullet Ří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í:


Bullet Rozhodování if-then[-else]
Bullet Rozhodování elseif
Bullet Cyklus repeat-until
Bullet Cyklus for-endfor
Bullet Skoky goto resp jump a jump.*
Bullet Volání / návrat podskriptů call, call.args a return
Bullet Volání / návrat procedur uvnitř skriptu _call a _return
Bullet Ukončení exekuování skriptu exit a exit.*
Bullet Příkazy switch a ifsome

Bullet 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.

Bullet 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:

     relace 

Relace jsou:

    =              rovnost stringu
    >
    >=
    <
    <=
    <>
    same           rovnost bez ohledu na case pismenek
    prefix
    infix
    nofix
    int=           rovnost cisel
    int>
    int>=
    int<
    int<=
    int<>
    float=
    float>
    float>=
    float<
    float<=
    float<>
    visible       Leva strana jmeno promenne, prava 1 nebo 0. Testuje viditelnost v gridu.
    fexists       Leva strana je jmeno souboru a testuje se na existenci, pravá je 1 nebo 0.

Termy jsou typu:

    @Promenna - hodnota promenne
    Konstanta
    void - prazdny string

Příklad:

    if @RC <> void then show.message Nalezeno else jump Error

    if RC visible 1 then call prace.prg else exit.show.message Akce nema smysl - neni videt RC

Relace je možno řetězit do seznamu, přičemž determinativy "or","and" a "not" určují smysl, v jakém
se seznam vyhodnocuje. Vyhodnocuje se zleva doprava do okamžiku, kdy se zjistí, že podmínka je
zaručeně splněna nebo nesplněna. Není tedy nutně celý seznam vyhodnocen. Například:

    if or,@Uzivatel = Petr,@Uzivatel = Jan then _call NormalniAkce else _call ToNesmite

Obalení mezerou u operátorů je povinné, slůvko void je důležité na definici prázdného stringu, který není
jinak jak napsat.

Bullet 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.


Bullet Rozhodování elseif Tento konstrukt jenom doplňuje rozhodování if-then-else jednoduše tak, že se provádí, pokud v předchozím if-then nebyla provedena klauzule then.
Bullet Cyklus repeat-until Cyklus repeat-until má syntax podobnou jako v Pascalu. Za until se tedy očekává podmínka nebo konstanta true. Pakliže je podmínka splněna, pokračuje se za until. Jinak se dynamicky vyhledá odpovídající repeat a pokračuje se za ním.
Příklad:

  set i,2
  repeat
    _call !Zpracovani,X=$(i)
    inc i
  until i = 72


Bullet Cyklus for-endfor V klauzuli for se očekává jméno proměnné a dolní a horní mez jako číselné hodnoty. Do cyklus se vstoupí přiřazením dolní hodnoty do proměnné a pokračuje se, pokud je její hodnota menší než požadovaná mez. Přikaz endfor vyhledá odpovídající for, přičte 1 do řídící proměnné a pokud je hodnota menší nebo rovna než horní mez, cyklus pokračuje za for. Jinak končí za enfor.
Příklad:

  for i,2,72
    _call !Zpracovani,X=$(i)
  endfor


Bullet Příkaz break. Cykly repeat-until a for-endfor je možno ukončit i pomocí break. Break může mít jako parametry repeat,until nebo for,endfor nebo jinou dvojici párovaných konstruktů. Default je repeat,until.
Příklad:

  set i,2
  repeat
    _call !Zpracovani,X=$(i)
    inc i
    if @X = Chyba then break
  until i = 72


Bullet Používání unless Pokud ve skriptu zapíšeme explcitně unless on, pak se může každý řádek doplňovat nepovinnou podmínkou pro nezpracování - unless. Podmínka je stejná jako u until nebo if.
Příklad:

  set i,2
  unless on

  repeat
    _call !Zpracovani,X=$(i)
    break unless @X <> Chyba
    inc i
  until i = 72

Bullet 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
    =======================================================

Bullet 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
    =======================================================

Bullet 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Č
    =======================================================

Bullet 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.
    -------------------------------------------------------------------------------------------------------------


Bullet Příkazy switch a ifsome

BulletRejstřík kapitoly
BulletNadřízená kapitola dokumentace / rejstřík


JLABS Aktualizováno dne 20000704. Komentář: info@jlabs.cz