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.