Iskazi (statements)

Iskaz dodeljivanje

Sintaksa iskaza dodeljivanja je sledeca:

<var1> [, <var2> ..., <varN>] := <expr>;

U <var1> varijablu se smesta rezultat <expr> izraza i <var1> po potrebi menja svoj tip u odgovarajuci. Prethodna vrednost smestena u <var1> se gubi.

U slucaju da je rezultat <expr> lista moguce je elemente redom smestiti u <var1>, <var2>, ..., <varN> varijable. U slucaju da elemenata liste ima vise nego varijabli, visak se ignorise. U slucaju da elemenata ima vise nego varijabli, visak varijabli se ignorise, tj. zadrzava staru vrednost i tip.

Iskaz if

Sintaksa iskaza if je

if <expr1> then
  S1;
elsif <expr2> then
  S2;
...
elsif <expr3> then
  Sn;
else
  S0;
end;

Redom se evaluiraju <exprX> izrazi i njihov rezultat se konvertuje u tip boolean. Za prvi koji je jednak true izvrsava se odgovarajući Sx niz iskaza. Ostali izrazi se ne evaluiraju. U slucaju da ni jedan od izraza nije ispunio uslov izvrsava se, ako postoji, S0 niz iskaza.

Ovde se implicitno podrazumeva da se rezultat svakog od <exprX> izraza može konvertovati u boolean tip. U suprotnom rezultat je runtime greška.

U slučaju da se pri evaluiranju nekog od exprX izraza dođe do greške, runtime će prijaviti grešku na liniji na kojoj je započeo if iskaz. FIXME.

Iskaz for

for iskaz ima tri različite sintakse za tri situacije za koje je namijenjen. Prva je:

for <var>:=<from_expr> to <to_expr> do
  S;
end;

Prvo se evaluiraju izrazi <from_expr> i <to_expr>, zatim <var> poprima vrednosti i tip evaluacije <from_expr>. Ova vrednost se sukcesivno inkrementira i izvršava se S niz iskaza dok god je <var> manje ili jednako od rezultata <to_expr>.

Ukoliko za tip rezultata <from_expr> nije podržana operacija inkrementiranja (OpSucc, podržana za tipove number, boolean, date i time), ili rezultat <to_expr> nije moguće konvertovati u tip rezultata <from_expr>, desiće se runtime greška.

Druga forma for iskaza je array iterator. Sintaksa je:

for <key>, <value> in <arr> do
  S;
end;

Treća forma je...

Iskaz while

Sintaksa while iskaza je

while <expr> do
  S;
end;

Gde je <expr> izraz, a S je niz iskaza koji se izvrsava dok je vrijednost izraza <expr>, konvertovana u tip boolean jednaka true.

Podrazumeva se da je <expr> moguce konvertovatu u boolean tip. U suprotnom rezultat je runtime greska.

Iskaz loop

Sintaksa loop iskaza je

loop
  S;
end;

Ponavlja se izvrsenje iskaza S dok se ne izadje iz ove petlje sa exit ili return iskazom, ili zbog propagiranja nekog od izuzetaka.

Iskaz repeat

Sintaksa repeat iskaza je

repeat
  S;
until <expr>;

Ponavlja se izvršenje iskaza S, dok vrijednost izraza <expr>, konvertovana u tip boolean ne poprimi vrednost true. Podrazumeva se da je <expr> moguće konvertovati u boolean tip. U suprotnom rezultat je runtime greška.

Iskaz case

Sintaksa case iskaza je

case <expr> of
| <expr0> =>
  S1;
| <expr1> =>
  S2;
...
| <exprN> =>
  Sn;
else
  S0;
end;

Prvo se vrši evaluacija <expr> izraza, zatim se redom evaluiraju izrazi <exprX> i porede sa <expr>. Prvo uspešno poređenje izvršava odgovarajući Sx niz iskaza i napušta se case iskaz bez dalje evaluacije preostalih <exprX>.

U slucaju da ni jedno poredjenje nije uspelo izvrsava se S0 niz iskaza u else ogranku, ako je isti definisan.

Iskaz match

Sintaksa match iskaza je

match <expr> of
| <expr1> [, <var1>]:
  S1;
| <expr1> [, <var2>]:
  S2;
...
| <exprN> [, <varN>]:
  Sn;
else
  S0;
end;

Prvo se vrši evaluacija <expr> izraza koji predstavlja uzorak, a potom se redom evaluiraju <exprX> čiji rezultat pretstavlja regularni izraz. Za prvi uspešni match izvršava se odgovarajući Sx niz iskaza; Ako je navedena opcionalna varijabla <varX> u nju se smešta lista čiji su elementi nizovi. Svaki niz ima polja start, end i value, gde su start i end početna odnosno krajnja pozicija match-ovanog izraza, a value njegova vrednost.

U slučaju da nije postojao uspešan 'match' izvršava se, ako je definisan, S0 niz iskaza.

Iskaz exit

Iskaz exit prekida izvršavanje zadnjeg započetog (innermost) loop iskaza.

Iskaz return

Izraz return [<expr>] prekida izvršavanje trenutne procedure i vraća kontrolu na mesto gde je procedura bila pozvana. Ako je naveden opcionalni izraz <expr>, vrši se njegova evaluacija i rezultat evaluacije biva upotrijebljen kao povratna vrijednost procedure.

Iskaz every

* Ovo je sad u okviru for, opisati gore.

Sintaksa every iskaza je

every <var> in <expr> do S end;

Rezultat evaluacije <expr> se konvertuje u listu, a zatim <var> poprima redom elemente liste i za svaki element se izvrsava S niz iskaza.

every <var1>, <var2> in <expr> do S end;

Rezultat evaluacije <expr> se konvertuje u niz, a zatim <var1> i <var2> poprimaju vrednosti kljuca i asocirane vrednosti respektivno. Za svaki element niza se izvrsava niz iskaza S. asocijativnog niza <expr>.

Iskaz try

Sintaksa try iskaza je

try
  S;
handle E1[(<var1>)] =>
  S1;
handle E2[(<var2>)] =>
  S2;
...
handle En[(<varN>)] =>
  Sn;
finally
  S0;
end;

Niz iskaza S se izvršava. Ukoliko se u toku izvršavanja iskaza desio neki izuzetak pokušava se naći odgovarajući hendler medju E1, E2, ... En hendlerima. Ako je nađen izvršava se odgovarajući Sx niz iskaza. U suprotnom se izuzetak propagira na gore do sledećeg try iskaza. U slučaju da se došlo do kraja steka ugnježđenih poziva procedura i nije pronađen odgovarajući hendler rezultat je runtime greška.

Ukoliko je uz izuzetak koji se desio prosleđen i argument, varijabla <varX> (ako je navedena) uz odgovarajući hendler Ex, ona poprima vrednost prosleđenog argumenta prije izvršavanja pripadajućeg Sx. Ako je definisan, niz iskaza S0 se bezuslovno izvršava pri izlasku iz try iskaza.

Iskaz raise

Sintaksa raise iskaza je

raise E [<expr>]

Gde je E izuzetak uz koji se opcionalno moze proslediti argument <expr>.

Iskaz lock

Sintaksa lock iskaza je

lock M do 
  S;
end;

gdje je M izraz koji se evaluira u mutex objekat, S bilo koji iskaz.

Iskaz wait

Sintaksa wait iskaza je

wait C release M

gde je C izraz koji se evaulira u signal objekat, a M izraz koji se evaulira u mutex objekat. Iskaz wait je ispravan u okviru liste iskaza unutar lock iskaza koji zaključava mutex M.

lock M do
   ...
   wait C release M
   ...
end;

Iskaz signal

Sintaksa signal iskaza je

signal C;

Iskaz finish

Sintaksa finish iskaza je

finish T;

gdje je T thread.

Iskaz text

Sintaksa text iskaza je

text 
  Proizvoljan 1- ili višelinijski text
end;