A legtöbb programozási nyelvhez hasonlóan az SR-ben is megkülönböztetünk előre definiált alaptípusokat és a felhasználó által ezekből ill. más, már bevezetett típusokból felépített típusokat. Más felosztásban lesznek olyanok, melyeken értelmezve van valamilyen ekvivalencia reláció, másokon pedig még valamilyen rendezési reláció is. Először vizsgáljuk meg az alaptípusokat!
Az SR-ben öt alaptípus van: bool, int, real, char és a string.
Két lehetséges értéke van: true és a false.
Négyféle előre definiált logikai operátor áll rendelkezésünkre:
Amint a fenti listából is látszik, majdnem minden logikai operátor rendelkezik egy egyszerűbb alakkal is. Az első három infix, míg a negáció prefix alakban használatos. Mindegyikük LUSTA kiértékelést használ.
Előjeles egész típus.
Operátorai:
Lebegőpontos valós típus.
Operátorai:
Karakter típus
Karaktersorozat típus.
Változódeklarációnál meg kell adni a maximális méretét is, pl.:
Operátorai:
Minden alaptípus rendezett és értelmezett rajtuk az egyenlőségvizsgálat. String esetén a rendezettség lexikografikus rendezettséget jelent, míg logikai esetben false > true -ként értelmezett. A következő relációs operátorok használhatóak:
Ezek az operátorok a rendezett felhasználói típusokra, míg az egyenlőségvizsgálat a pointerekre és a capabilty-kre is értelmezettek.
A relációs operátorok precedenciája nagyobb, mint a logikai operátoroké.
A következő típuskonstrunkciók megengedettek: tömb-, felsorolási-, rekord-, unió-,pointer-, operációtípus ill. operáció capability. Mielőtt megnéznénk mit is jelentenek ezek, ismerjük meg a típusdeklaráció általános szintaxisát:
Most pedig lássuk a lehetséges típusdefiníciókat!
A felsorolási típusok szimbolikus literálokat definiálnak. Minden felsorolási típus rendezett típus, méghozzá elemeik felsorolásának sorrendjében. Definíciója nem más, mint elemeinek - azonosítóknak, amik a típusértéket reprezentálják - vesszővel elválasztott felsorolása.
Nézzünk egy-két példát:
Fontos, hogy a felsorolásban használt azonosítók a teljes programban egyediek legyenek! Ez a korlátozás nem engedi meg, a felsorolási típusértékek átlapolását. Azaz a következő kód hibás:
Láthatjuk, hogy ekkor az Ibolya mind a két felsorolásban szerepel, ez fordítási hibához vezetne! (De ha pl. a virágokban kisbetűvel írnánk, az már jó lenne!).
A tömb definíció szintaxisa a következő:
A type_id tetszőleges típusnév. Tehát egy vagy több range, indextartomány vesszővel elválasztva (minden range egy dimenziót reprezentál), ahol egy range-t két féleképp adhatunk meg:
Fontos megjegyezni, hogy mind karakterekkel, mind felsorolási-típusokkal is indexelhetünk tömböket. Nézzünk erre néhány példát:
Ezután vizsgáljuk meg, milyen tömb-konstruktoraink vannak, azaz hogyan adhatunk egy tömbváltozónak kezdeti értéket. Ez lényegében a tömb elemeinek vesszővel elválasztott felsorolását ill. az egész bezárójelezését jelenti. Formálisan:
ahol minden vect_elem kétféle lehet:
Néhány példa:
A több dimenziós eset teljesen analóg az előzővel. A különbség annyi, hogy ekkor a fenti "kifejezés" mindenhol egy tömb konstruktor.
Megjegyzés: lehetséges típus nélküli tömbdeklaráció is. Ezt részletesebben a változódeklarációknál mutatjuk be.
A módszertanból ismert direktszorzat típust a legtöbb nyelv rekord segítségével valósítja meg. Ez alól az SR sem kivétel. Nézzük a rekord-definíció szintaxisát:
A rekord minden mezőjének méretét már fordítási időben ismernünk kell. (pl. tömb vagy string mezők hossza fordítási idejű konstans kell legyen!)
Rekord-konstruktorokat használhatunk teljes rekord értékének megadásához (hasonlóan a tömbökhöz). Ekkor meg kell adnunk egy azonosítót, a rekord típusnevét, majd zárójelek között egy vagy több kifejezést (vesszővel elválasztva), melyek a rekord mezőinek megfelelő értékek lesznek.
Nézzünk egy két példát a típusmegadásra:
Példák a rekord-konstruktorokra:
Az unió típus különböző típusok gyüjteménye, melyek mindegyike rendelkezik egy hivatkozási névvel. Az SR a C nyelvben megismert szabad uniót valósítja meg. A rekordhoz hasonló szintaxissal definiálható:
A rekorddal ellenben egyszerre csak egy mező hordozhat korrekt adatokat. A C-nél látott problémák itt is fennállnak. Csak nagy odafigyeléssel használjuk.
Lássunk egy-két példát:
Csak valamely mezőjén keresztűl kaphat értéket!
Különböző adatokra mutató referenciákat definiál a pointer típus. Lehetőségünk van típushoz kötött és típusfüggetlen pointer típusok definiálására.
Az első típusú pointer csak az adott típus objektumaira állítható, míg a második bármilyen típus példányára.
Nézzünk példákat:
Az általánosított ptr any pointer típus bármilyen más típusú objektumra hivatkozhat, értékül adható másik ilyen pointernek. De nem lehet dereferálni!
A null pointer literál használható üres referenciaként. Ez bármely pointer típus esetén használható.
Az address-of operátor az @ karakter, ami visszaadja egy változó címét, mely bármely (megfelelő típusú) pointernek értékűl adható.
Változódeklarációk általános formája a következő:
Tömbök esetén a változónevek után []-jelek között dimenziókat is megadhatunk.(Névtelen tömb típus)
Látható, hogy a változódeklarációkat a sor eleji var kulcsszó vezeti be. Lehetőségünk van kezdeti érték megadására is. Tömbök és rekordok esetén a korábban bemutatott konstruktorokkal adhatunk kezdeti értéket.
Példák:
A konstansok bevezetése a változódeklarációtól (szintaxisában) teljesen függetlenül történik. Konstansokat a sor eleji const kulcsszóval vezetjük be.
A := értékadó operátor egy váltózónak (pontosabban balértéknek) egy kifejezést ad értékűl. Maga az operátor NEM kifejezés, azaz az SR ebben a Pascalos vonalat követi.
Értékadás formája:
Ezenkívűl számos összetett, speciális értékadásra is lehetőségünk van. Ezek az operátorok a C értékadó operátoraihoz hasonlóak:
Ezen operátorok jelentése: a bal oldal és jobb oldal között a := előtti műveletet elvégezzük, és az eredményt értékűl adjuk a bal oldalon álló változónak (pl.: a +:= b <===> a := a + b).
A |:= és a &:= operátorok logikai változók és kifejezések között, míg a ||:= a konkatenáció, stringek között használatos.
A >>:=, <<:= pedig a jobbra- ill. balrashiftelés bitműveletei.
Ezeken kívűl működik még a C-ben használatos pre-, ill. postfix ++ , és --, ami a módszertanbeli increase és decrease műveleteknek felel meg.
Specialitása a nyelvnek, hogy rendelkezik egy beépített swap/csere operátorral (:=:). Ennek mindkét oldalán balérték kell, hogy szerepeljen. Az operátor végrehajtása után a bal- ill. jobboldalon levő változók értéke megcserélődik, kölcsönösen értékűl adódik a másiknak.
Példa swap operátorra:
Az SR-beli típusekvivalencia a struktúrális ekvivalencián alapul. Egy objektum akkor adható értékűl egy másiknak, ha struktúrájuk azonos.
Nézzük a következőket:
Tehát a fentiek alapján az r1 és r2 triviálisan ekvivalens ugyanúgy, ahogy az r1 és r3, ill. az r2 és az r3. Azonban az r1 és r4 nem ekvivalensek, mivel mezőik típusai nem ekvivalensek. Hasonlóan a col és a names felsorolási típusok is ekvivalensek. (A books-szal egyikük sem ekvivalens)