Absztrakt adattípusok
Beépített típusok
A fontosabb beépített típusok a következők:
- Number – számok ábrázolására, Int és Float altípusai vannak
- Record – a „szokásos” rekord típus, egyetlen altípusa a tuple
- Chunk - lehetővé teszi új absztrakt típusok bevezetését
- State - állapot tárolása, módosítása alkalmas
- Space – fejlett problémamegoldáshoz lesz fontos
- FDInt - véges tartományok típusa, gyakran használt a logikai programozásban
- Name – egyedi névtelen tokent vezet be
- Thread – szálak azonosítására
- Port – portok jelölésére
Két változó akkor egyenlő, ha a típusuk megegyezik vagy egyik a másiknak altípusa, és az értékük megegyezik. Nincs automatikus típuskonverzió értékadáskor.
Néhány típussal részletesebben is foglalkozunk a továbbiakban.
Literálok
Atomok és nevek. Az atomok lexikografikusan rendezettek.
Új név létrehozása: {NewName X} ahol X egy új név, ami teljesen egyedi.
A Name altípusa a Unit és a Bool. A Bool nem felüldefiniálható.
Rekordok és sorok
Összetett adatszerkezetek. Egy rekord egy címkéből és adott számú argumentumból áll. Létezik változó számú argumentumot tartalmazó rekord is, ez az ún. nyitott rekord (open record). Minden argumentum egy Feature:Field párból áll. Egy rekord pl.:
tree(key: I value: Y left: LT right: RT).
Egy rekord egy attribútumára a „.” operátorral hivatkozhatunk: Record.Feature
A sor címkéből és attribútumokból áll, ez csak szintaktikai egyszerűsítése a rekordnak, pl.: tree(I Y LT RT), ekkor a feature –ök pozitív egészek 1 –től a rekordok számáig.
Listák
Más szimbolikus nyelvekhez hasonlóan a listák itt is fontos szerepet játszanak. A lista nem kötődik egy adattípushoz, inkább elvi struktúra. Egy lista vagy a nil atom, ami az üres listát jelképezi, vagy az infix „|” operátor két argumentummal. Pl.: 1|2|3|nil . Meghatározott számú elemet tartalmazó, ún. zárt listákhoz használható a következő jelölés: [ 1 2 3 ] .
1 | 2 | x ahol x változó
Az alábbi kifejezések ekvivalensek:
"OZ 3.0"
[79 90 32 51 46 48]
[&O &Z & &3 &. &0]
A virtuális string -ek speciális sorok. A konkatenáció akkor történik meg, amikor mindenképp szükséges. 123#"-"#23#" is "#100 a "123-23 is 100" stringet reprezentálja.
A listák kiemelt szerepe megkívánja néhány listákon működő utasítás ismertetését:
Adott hosszúságú üres lista létrehozása:
List.MakeList Elemszám
Lista létrehozása A és B közé számokkal Step közökkel:
List.number A B Step
Például
List.number 2 9 3
eredménye a [2 5 8] lista lesz.
Listák összefűzése:
List.Append L1 L2
Lista hosszának lekérdezése:
List.Length L
A listák elemei 1-től számozott elemek. Az N. elem lekérdezése:
List.Nth L N
A lista utolsó elemének lekérdezése:
List.last L
A lista első N elemének listáját (vagy a lista másolatát, ha az N-nél kevesebb elemet tartalmaz) visszaadó utasítás:
List.take L N
A lista első N elemének elhagyásával kapott lista lekérdezése (nil az eredmény, ha a lista N-nél kevesebb elemet tartalmaz):
List.drop L N
A lista szétválasztása két listába az N. elemnél:
List.takeDrop L N L1 L2
Ez voltaképpen a
L1 = {List.take L N}
L2 = {List.drop L N}
parancsok együttes végrehajtását jelenti.
A lista rendezése a Po függvény által meghatározott sorrendbe:
List.Sort L Po
Például
{List.Sort [c b d a b] value.’<’}
eredménye az [a b b c d] lista lesz.
Két rendezett lista összefésülése a Po függvény által meghatározott rendezés szerint:
List.Merge L1 L2 Po
Például
{List.Merge [a b d] [b c d] value.’<’}
eredménye az [a b b c d d] lista lesz.
A lista minden elemére a Po eljárás alkalmazása:
List.ForAll L Po
Például
{List.ForAll [X1…Xn] Po}
utasítás jelentése:
{Po X1} … {Po Xn}
A logikai értékkel visszatérő Po függvény esetén értelmezhető a
List.All L Po
és a
List.Some L Po
művelet is, amely megadja, hogy Po igaz értéket ad-e minden listaelemre illetve ad-e igazat valamely listaelemre.
Ha Po továbbra is logikai értékkel visszatérő függvény, akkor a lista azon elemeinek listája, amelyekre Po igaz a
List.Filter L Po
paranccsal állítható elő. Amennyiben szükség van azon elemek listájára, amelyre Po igaz értéket ad és azon elemek listájára is, amelyekre Po hamis értékkel tér vissza, akkor a
List.Partition L Po Lt Lf
Parancs használható, amelynek eredményeként Lt listába kerülnek az igaz értéket és Lf listába a hamis értéket visszaadó elemek.
Amennyiben a fenti három esetben a Po eljárásnak szüksége van paraméterként az aktuális paraméter listabeli indexére, akkor a
List.ForAllInd L Po
List.AllInd L Po
List.SomeInd L Po
metódusok használhatóak.
Tömbök
Tömböt a következő módon hozhatunk létre:
Tömbnév = Array.NewArray(LowI HighI InitX)
A fenti utasítás hatására létrejön egy LowI és HihgI közé eső integerekkel indexelt tömb, amelynek minden eleme felveszi az InitX kezdeti értéket.
A tömbök indexhatárai tehát a tömb létrehozásakor rögzítettek és nincs lehetőség ezek későbbi megváltoztatására. A tömb objektum eltárolja ezeket az adatokat és lekérdezhetővé teszi őket az
Array.Low Tömbnév
és az
Array.High Tömbnév
függvények segítségével.
Adott indexú elemnek értéket adni az
Array.Put Tömbnév Index Érték
paranccsal lehet. Adott indexű elem lekérdezése az
Array.Get Tömbnév Index
függvénnyel lehetséges, illetve lehetőség van adott indexű elem lekérdezésére és megváltoztatására egyidőben az
Array.Exchange Tömbnév Index Régiérték Újérték
utasítás használatával.
Amennyiben a tömb egy illegális indexű elemére kísérlünk meg hivatkozni, úgy kivétel keletkezik.
Minden említett adattípushoz tartozik egy megfelelő modul a Mozart rendszerben, ami műveleteket definiál az adott típusra.