BOOL |
Logikai típus true és false értékekkel. |
BYTE |
Byte típus, tehát egész szám 0 és 255 között. |
INT |
Előjeles egész típus, hossza implementációfüggő. |
INT16 |
Előjeles egész típus -32768 -tól 32767 -ig. |
INT32 |
Előjeles egész típus 32 biten ábrázolva. |
INT64 |
Előjeles egész típus 64 biten ábrázolva. |
REAL32 |
Valós szám előjellel, 8 bites exponenssel és 23 bites számmal. |
REAL64 |
Valós szám előjellel, 11 bites exponenssel és 52 bites számmal |
Az OCCAM nyelv nem használ mutató típust.
Lehetőségünk van tömböket létrehozni bármely egyszerű típusból vagy nevezett típusból. A tömb indexei a nemnegatív egész számok lehetnek. Többdimenziós tömböket is készíthetünk, sőt, a dimenziók számára nincs felső korlát. Pl.:
Nevezett típus létrehozása tömbből:
Az indexhatár lehet kifejezés is, ha kiértékelhető fordítási időben és pozitív egész értékű. Két tömb típusa megegyezik, ha ugyanazok az indexhatárai és az alaptípusuk megegyezik.
Tömbök használata: van indexhatár-ellenőrzés (az index nem lehet negatív, és 0..n-1 közé kell hogy essen). Pl.:
Egy rekord típus valamilyen, akár különböző típussal rendelkező mezőkből áll, így logikai egységbe foglalhatóak összetartozó egységek. Pl.:
Ez egy komplex számot reprezentáló rekord típus megvalósítása OCCAM-ban. Egy rekord mezői lehetnek egyszerű típusok, nevezett típusok és ezekből képzett tömbök is. Rekord típusú literálok képzésére van lehetőségünk, ezeket egy rekordnak értékül lehet adni. Feltétele, hogy a rekord mezőinek típusának megfeleljenek a literál mezői. Pl.:
Az egyes mezőkre külön lehet hivatkozni, eltérő szintaxissal, mint c-ben: Pl.: COMPLEX c;
A rekordok és a tömbök tetszőleges mélységben egymásba ágyazhatók: Pl.:
Lehetőségünk van létrehozni üres rekordot is:
Ekkor a típus NONE-lesz, a példányai pedig ilyen alakúak lehetnek: [](NONE)
Occam-ban lehetőségünk van unió típust is létrehozni, amit a legelterjedtebb nyelvek nem támogatnak, cask közvetett módon öröklődéssel.
Az unió segítségével többek között több reprezentációt adhatunk meg egy típushoz, ezzel is segíti a nyelv a platformfüggetlenséget. Pl.:
Itt a complex típusnak kétféle ábrázolási módot engedünk meg. Ekkor egy COMPLEX x változónak így lehet értéket adni:
Ezek nem állnak rendelkezésre OCCAM-ban.
A táblák az OCCAM nyelv speciális literáljai, melyek egy adott típusból való elemek tömbjei. A sztring egy speciális tábla, ahol az alaptípus byte. Pl.:
A sztringeket írhatjuk több sorba is, tehát nem kell egy hosszú sztringet besűríteni egy sorba, de ekkor a sor végére, és a következő sor elejére * -ot kell írni. A sztring második sorának beljebb kell kezdődnie, mint ahol a sztringdefiníció kezdődött. Pl.:
Bővebb leírás itt található.
Bővebb leírás itt található.
Igazi altípusképzésről nem beszélhetünk, viszont lehetőség van ún. nevezett típusok létrehozására, melyek ugyanazzal az értékkészlettel rendelkeznek, mint a típus, amiből képezzük őket.
Hasznos lehet ez pl. olyankor, ha több különböző változó ugyanazzal az egyszerű típusú értékkészlettel rendelkezik. Pl., ha van egy COST és egy WEIGHT típusú változónk, biztosak lehetünk benne a típusellenőrzés miatt, hogy COST nem lett WEIGHT típusúnak értékül adva, vagy egy függvénynek nem COST-ot adunk át, mikor WEIGHT-et vár.
Érdekesség:
Ebben az esetben a és b típusa különbözik, mert minden új típus bevezetésénél (akár az eddigivel megegyező nevű) kapunk egy új típust.
A nyelvben automatikus típuskonverzió nincs, viszont van lehetőség típuskonverzióra, mint operátor, nem tömb numerikus típusokra.
Ha a konverziókor csökken a számunk pontossága, lehetőségünk van a TRUNC kulcsszó használatára, ami csonkolja a számot, vagy a ROUND használatára, amely a kerekítésnek felel meg.
Logikai értékekre:
BOOL 1 |
megfelel a true-nak |
BOOL 0 |
megfelel a false-nak |
INT TRUE |
|
|
0 |
Ha integer vagy byte és valós számok között konvertálunk vagy fordítva, meg kell mondanunk, hogy kerekítéssel vagy csonkolással működjön a konverzió. Pl.: legyenek n, m INT64 változók, n=255 és m=3, ekkor:
BYTE n |
egy byte értéket készít, 255 |
REAL32 ROUND n |
REAL32, értéke 255.0 |
REAL64 TRUNC n |
REAL64, értéke 255.0 |
REAL64 ROUND (n*m) |
REAL64, értéke 765.0 |
(REAL64 ROUND n) * (REAL64 ROUND m) |
REAL64, értéke 765.0 |
Rekord típusok „konverziójára” is van lehetőség: Pl:
Minden változónkat deklarálnunk kell használat előtt, vagyis hozzárendelni egy típust a változóhoz. (Az OCCAM szigorúan típusos nyelv.) Pl.:
Ugyanúgy megy, mint c-ben, a változónak kezdőértéket nem adhatunk:
<változó deklaráció> ::= <típusnév> <változó nevek>{,<változó nevek>}:
pl .:
Az OCCAM biztosít lehetőséget konstansok deklarálására a következőképp:
VAL <Adattípus> <név> IS <kifejezés>:
Itt a név változó nem kaphat új értéket, típusa Adattípus lesz, a kifejezésnek pedig futásidőben kiértékelhetőnek kell lennie.
Például:
Lehetőségünk van tömbökből több elemre hivatkozni, ezt hívjuk most szegmensnek. A szegmens maga is egy tömb, nulla vagy több elemmel. Töbök és szegmensek, ha típusuk megfelelő, egymásnak értékül adhatóak.
Pl.:
legyenek [9] INT clock , [8][9][10]REAL32 data !
Ekkor :
BYTE n |
egy byte értéket készít, 255 |
REAL32 ROUND n |
REAL32, értéke 255.0 |
REAL64 TRUNC n |
REAL64, értéke 255.0 |
REAL64 ROUND (n*m) |
REAL64, értéke 765.0 |
(REAL64 ROUND n) * (REAL64 ROUND m) |
REAL64, értéke 765.0 |
A változó és a típusok hatóköre: Kezdődik a típus vagy a változó deklarációját lezáró ’:’ utáni sor elejétől és a blokk végéig tart.
Külső blokkban lévő változót felül lehet deklarálni belső blokkban, ekkor az újbóli hivatkozás a változóra már a belső blokkban deklaráltra fog vonatkozni. Nincs lehetőség a külső blokkbeli változóra hivatkozni.
Pl.:
Lehetőségünk van a programunkban használt nevek rövidítésére. Ld. még a paraméterátadási módoknál . Pl.:
clock FROM 0 FOR 2 |
clock első két komponense, típusa [2] INT |
data FOR n |
data első n komponense, típusa [n][9][10] REAL 32 |
data FOR m FOR 0 |
üres szegmens, típusa [0][9][10] REAL 32 |
Amíg az átnevezés hatóköre tart, addig nem lehet használni az eredeti változót, amit átneveztünk.
Ez hatékonysági megfontolások miatt lett így specifikálva.
Pl.:
Lehetőségünk van nemcsak változók, hanem értékek elnevezésére is. Ld: Konstansdeklarációk .
A kifejezések operandusokból, operátorokból és zárójelekből állhatnak, kiértékelés után egy értékkel és egy típussal rendelkeznek. Az operandusok lehetnek változók, literálok, egy tábla, vagy egy újabb kifejezés zárójelek közt.
OCCAM-ban nincs operátor precedencia, ezért a kiértékelési sorrendet zárójelekkel kell meghatározni. Az operátorok:
+ |
összeadás |
>> |
balra tolás |
- |
kivnás |
<< |
jobbra tolás |
* |
szorzás |
AND |
és |
/ |
osztás |
OR |
vagy |
\REM |
maradék |
NOT |
nem |
PLUS |
modulo összeadás |
= |
egyenlő |
MINUS |
modulo minusz |
<> |
nem egyenlő |
TIMES |
modulo osztás |
> |
nagyobb |
/\BITAND |
bitszintû és |
< |
kisebb |
\/BITOR |
bitszintû vagy |
<= |
kisebb egyenlő |
>< |
bitszintû kizáró vagy |
>= |
nagyobb egyenlő |
~ |
bitszintû nem |
AFTER |
később mint |
SIZE |
tömb mérete |
BYTESIN |
tömbelem mérete byte-ban |
Adattípusok operátorai:
MOSTNEG |
a típus legkisebb negatív értéke |
SIZE |
a tömb mérete (integer) |
MOSTPOS |
a típus legnagyobb pozitív értéke |
BYTESIN |
egy rekordban hossza byte-ban |
OFFSETOF |
egy rekord mező eltolása byte-ban |
|
|
A retyping (újratípusozás) konverzió egy szintaktikus specifikáció, (definíció) amely az egyik adattípust egy bit minta segítségével egy másikká alakítja a saját hatókörén belül. Ez a konverzió háromféle lehet:
Formális definíció:
A retyping (újratípusozás) konverzió függ a számítógépbeli pontos ábrázolástól.
Annak érdekében vezették be, hogy hordozható legyen a program a különböző architektúrák között.
Az újratípusozás konverzió egy bit minta segítségével leszűkíti a típust, és ennek az új típusnak ad egy új nevet.
Pl.:
kifejezés értékét konvertáljuk:
A második példában a 42.0 real típusú változót konvertáljuk int64-é, ami ezután pattern névvel hivatkozható.
A retyping konverzió egy új típust specifikál egy meglévő változóból ugyanazzal a hosszal.
Pl.:
Változót konvertálunk:
Ebben a példában a condition változóra state névvel, mint egy 8 hosszú byte-okból álló tömbhöz lehet hozzáférni a SEQ blokkon belül.
A változót, amit újratípusoztunk nem lehet használni azon a blokkon belül, ahol ezt megtettük.
Ha a retyping konverziónál a céltípus egy tömb, akkor annak a tömbnek adhatunk üres dimenziót, és majd a fordító meghatározza, hogy mekkora legyen a tömb az átkonvertálandó típus függvényében, ezt meg tudja tenni, mivel az OCCAM szigorúan típusos nyelv.
Pl.:
Formális definíció:
A csatornák protokolljára azért van szükség, hogy a fordító ellenőrizni tudja a kimenő és a bemenő üzenetek típusát a csatornán.
Néha nélkülözhetetlen elfogadni egy csatornára más protokollokat is, mint amit eredetileg definiáltunk hozzá.
Pl.:
Ez egy triviális példa, ami néha felmerül a programozás során. A real.buffer nevű procedúra egy általános célú eljárás és nem felülírható. A generate.complex nevű eljárás csak az output-ot írja complex számokkal, amelyek párok a COMPLEX protokoll alkalmazásával. A cin, cout COMPLEX csatornákat átkonvertáljuk REAL típusúvá és ezt buffereljük, majd utána egyéb konverzió nélkül fel tudjuk dolgozni a bufferelt értékeket COMPLEX típusúként.
Formális definíció:
Ez egy speciális retyping konverzió, a tömbök aldimenzióinak átvariálására valók.
Pl.: