Az Oz/Mozart programozási nyelv

Utasítások, vezérlési szerkezetek

Utasítások, vezérlési szerkezetek

Értékadás, üres utasítás

Az üres utasítás a skip.
Az '=' operátor egyesíti a két változó értékét.
Az == ellenőrzi az egyenlőséget. Ellentéte a /=.
Értékadás különböző típusok között nem lehetséges.

Szekvencia

Egy deklaráció-end blokkon belül az egymás utáni függvényhívások egymás után hajtódnak végre. Nincs a parancsokat elválasztó ponotsvessző. Például:

local Max = proc {$ X Y Z} if X >= Y then Z = X else Z = Y end end X = 5 Y = 10 Z in {Max X Y Z} {Browse Z} end

Elágazás

Az IF kulcsszóval, mindig blokkolódik, ha a benne szereplő kifejezés értékadásra vár. End kulcsszóval kell lezárni, az else ág elhagyható.
Elseif is létezik, mint rövidítés.
Létezik többirányú elágazás is, a case kulcsszóval. Példák:

fun {Fact N} if N =< 0 then 1 else N*{Fact N-1} end end fun {Comb N K} {Fact N} div ({Fact K} * {Fact N-K}) end fun {SumList List} case List of nil then 0 [] H|T then H+{SumList T} end end
Ha egyik ágra sem illeszkedik a feltétel, az else ág hajtódik végre. Az else ág opcionális, de ha nem illeszkedik a feltétel és nincs else ág, kivétel fog keletkezni.

Ciklus

Eredetileg nincs ciklus, de később a Control modulban bevezették.
Az iterátorok nem vezérlési szerkezetek, de használatuk a ciklusszervezéssel szoros kapcsolatban van, így leírása ebben a fejezetben kap helyet.
A Mozart 1.1.1. óta a hivatalosan támogatott iterátorok a következők:
L lista elemeinek iterálása, minden iterációban X felveszi L soron következő értékét:

X in L
C stílusú ciklusok szervezésének megoldása. E1 kezdeti érték, E2 logikai kifejezés, E3 a következő érték. Az iterátor lefut, ha E2 a false értéket veszi fel:
X in E1;E2;E3 X in (E1;E2;E3)
Beiterálja az E1 és E2 közé eső integer értékeket E3-mal növelve két iteráció között a változó értékét:
X in E1..E2; E3
Megegyezik X in E1..E2; 1 kifejezéssel:
X in E1..E2
X in E1; true; E2 rövidített leírása:
X in E1;E2

For ciklus

For ciklust a nyelv kezdetben nem tartalmazott, de a Control modul megvalósította, mint általánosított iterátort:
local proc {HelpPlus C To Step P} if C=<To then {P C} {HelpPlus C+Step To Step P} end end proc {HelpMinus C To Step P} if C>=To then {P C} {HelpMinus C+Step To Step P} end end in proc {For From To Step P} if Step>0 then {HelpPlus From To Step P} else {HelpMinus From To Step P} end end end
For eljárás a P nevű függvényt (To – From)/Step egészrészeszer hívja meg. A megoldás láthatólag a függvénnyel való paraméterezhetőségre épít.

Ciklusok

Ciklusok átláthatóbb kezelésére a Mozart 1.1.0-ban két új kulcsszó került bevezetésre a for és do lehetővé téve a ciklusszervezés következő formáját:
for deklaráció do S end
ahol S ciklusmag. A deklaráció iterátorokat és változó deklarációkat tartalmazhat.
Az iterátorok
pat in generator
alakúak, ahol generator leírja, hogy hogyan kell előállítani pat megfelelő értékeit. pat változói lokálisak a ciklusmagon belül.
A nyelv támogatja a break és a continue utasítások használatát, de ezt kivételek alkalmazásával valósítja meg, így két veszélyt is rejt használatuk:
1. Ha a programunkban van minden kivételt elkapó catch ág, akkor az elkapja ezeket a kivételeket is.
2. A nyelv fejlesztői a későbbiekben fejleszteni kívánják ezt a két utasítást, így azok a programkódok, amelyek kezelik a break és continue utasítások kivételei nem fognak működni a későbbi implementációkban.
Mozart 1.1.1. óta lehetőség van ciklus visszatérőértékének definiálására a
return:R,
és a
default:D
parancs hívásával, így a ciklusok kifejezésként is használhatóak.

Vezérlésátadó utasítások

Csak a függvényhívások. A vezérlést át lehet adni úgy is, hogy blokkolunk változókat. Ezeket aktviálva a megfelelő threadek indulnak el.

Párhuzamos utasítások

A wait a programot blokkolja, amíg az X változó nem kap értéket.
thread-ek létrehozásával tudunk külön végrehajtási szálakat létrehozni.