A Modula-3 nyelv erősen típusos, mint az Algol családjába tartozó nyelvek
általában. Az erős típusosság felvet néhány problémát, melyeket a különböző
nyelveken más és más módon oldottak meg. Például:
x: ARRAY [0..9] OF INTEGER;
y: ARRAY [0..9] OF INTEGER;
TYPE"=" ";"
INTEGER
32 bites előjeles egész szám. Előredefiniált függvények:
x | y | x DIV y | x MOD y |
9 | 4 | 2 | 1 |
-9 | -4 | 2 | -1 |
9 | -4 | -3 | -3 |
-9 | 4 | -3 | 3 |
CONST
CharConst = 'A';
TextConst = "A";
E: real, D: longreal, X: extended
Különböző pontosságú lebegôpontos típusok. Műveleteik: +, -, *, /
Példák:
1.1 | REAL típusú; |
1.1D0 | LONGREAL, értéke: 1.1 |
1.1X0 | EXTENDED, értéke: 1.1 |
1.5e2 | REAL, értéke:150 |
-1.5x+2 | EXTENDED, értéke: -150 |
1.5E-3 | REAL, értéke: 0.0015 |
Kétféle referencia-típus létezik. Az alapértelmezett az un. TRACED POINTER, melynek felszabadításáról az automatikus szemétgyűjtő gondoskodik. A másik, az UNTRACED (REF) kulcsszóval ellátott pointer fajta esetében erre nekünk kell figyelni. Létezik még három predefinit altípus, a REFANY, ADDRESS, NULL, melyekre a következő altípus-relációk teljesülnek:
A NULL típus egyetlen lehetséges értéke a NIL, azaz a null pointer.NULL<:REF T<:REFANY és NULL<:UNTRACED REF T<:ADDRESS.
Példa:TYPE IntPtrType = REF INTEGER; ArrPtrType = REF ARRAY [1..5] OF CHAR;
TYPE StudentRef = REF Student; Student = RECORD CatalogNo: INTEGER; Firstname, lastname: TEXT; END; VAR ref1, ref2: StudentRef; BEGIN ref1:=NEW(StudentRef); (*create data record with address in ref1*) ref1.catalogNo:=1; (*set fields of new data record*) ref1.firstname:="Peter"; ref1.lastname:="Tall"; ref2:=NEW(StudentRef, catalogNo:=2, firstname:="Julie", lastname:="Short"); (*data record created and initialized*) ref2:=ref1; (*ref2 now points to first record; thus second cannot be referenced*) ref1:=NIL; (*first record can still be referenced with ref2*) ref2:=NIL; (*now second record is also inaccessible*)
Két alapvető fajtáját különböztetik meg:
ARRAY {"," ... } OF ";"
Az indextype-nak rendezett típusának kell lennie. Ez általában INTEGER típus szokott lenni, de lehet bármilyen felsorolási típus is. A slottype minden Modula-3-beli típus lehet. Példák:
Beépített műveletek a FIRST, LAST, NUMBER, amelyek a tömb első ill. utolsó indexét, valamint a számosságát adják meg, pl:
- Egydimenziós:
TYPE A1 = ARRAY IndexType OF ElementType.- Kétdimenziós:
vagyTYPE A2 = ARRAY Index1 OF ARRAY Index2 OF ElementTYPE A2 = ARRAY Index1, Index2 OF Element TYPE OneDimArray = ARRAY [1..20] OF REAL; OneDimArray2 = ARRAY ['A'..'Z'] OF INTEGER; TwoDimArray = ARRAY [1..20], [1..40] OF BOOLEAN; TwoDimArray2 = ARRAY [1..20] OF ARRAY [1..40] OF BOOLEAN; OpenArray = ARRAY OF INTEGER;
Pakolt típusnak befolyásolhatjuk a belső reprezentációját. Például megadhatjuk, hogy egy BOOLEAN bázistípusú tömb egy-egy biten tárolja az elemeit. Helytelen méret megadás fordítási hibát eredményez. A BITSIZE művelettel lekérdezhető egy típus vagy változó mérete bitekben (a BYTESIZE-zal bájtokban). Pl.:FIRST(OneDimArray) = 1; NUMBER(OneDimArray2) = 26.TYPE MonoBitMap=ARRAY Index1,Index2 OF BITS 1 FOR BOOLEAN;Direkt szorzat típus
Rekord
ahol> RECORD <fieldDecl> { ";" <fieldDecl> ... } END ";"<fieldDecl> = <id> [ ":" <type> ] [ ":=" <constant expr> ]Minden mezőnek van neve, típusa, és esetleg kezdőértéke. Pl.
TYPE Rec1 = RECORD x, y: INTEGER; name: TEXT
END; Rec2 = RECORD x, y := 0; (* Type is INTEGER *) name := "" (* Type is TEXT *) END; TYPE EmpData = RECORD name, firstname: TEXT; salary: REAL; END; (*Valtozo:*) VAR employee: EmpData; (*Szelektor:*) q.x := 10;A szokásostól (pl. Modula-2, Pascal) eltérően, rekord konstanst nem csak pozicionálisan, hanem név szerint kötve is megadhatunk, pontosan úgy, ahogy az eljáráshívásnál láthatjuk.
Pozicionális Point{20,30}, név alapján: Point{y:=30, x:=20}, kevert: először a pozicionálisak, ezt az értékadási módot el szoktuk kerülni, mert nehezen olvasható.Sokszor előfordul olyan eset, amikor egy rekord különböző mezőire hivatkozunk egymás után többször is. Ha ekkor még a rekord többszörösen összetett is, akkor nehézkes mindig ugyanazt leírni. A Modula-3-ban erre szolgál a WITH parancs. A parancs után felsoroljuk a rövidítéseket, és ezek értékét. Az ezt követő BEGIN/END között lesznek ezek érvényesek.
WITH <id> "=" <expr> { "," <id> "=" <expr>... } DO <stmts> ENDUnió típus
Halmaz típus
Nem indexelhetők az elemek, mert nincs sorrendjük.
Relációk, műveletek: unió (+), különbség (-), direktszorzat (*), szimmetrikus differencia (/). Egyenlőség (=), nem egyenlő (#), részhalmaz (<=, <, >=, >), tartalmaz (IN).TYPE Keys = {left, right, middle}; Mouse = SET OF Keys; VAR mouse: MouseTípuskonverziók
Változók, konstansok
A változódeklarációkat VAR, a konstansdeklarációkat CONST kulcsszóval kell kezdeni. Mindkettőnél meg kell adni egy azonosítót, majd kettőspont után egy típust és/vagy egy kezdőértéket. Ha nem adunk meg típust, akkor a kezdőérték típusát használja a fordító. A konstansoknál kötelező a kezdőérték megadása, és ez az érték később nem változhat meg.
Példák:
Konstans deklarációnál nem kötelező megadni a típust. De meg lehet:VAR a,b,c: type; a,b,c: type := expression; a,b,c:=expression; CONST MaxValue: INTEGER = 5 * (25 - 3); (* INTEGER *) MinValue = 2; (* INTEGER *) Caps = SET OF CHAR {'A'..'Z'}; (* SET OF CHAR *) A = 10; B = 2*A; TYPE Workdays = [Days.Monday..Days.Friday] CONST Weekdays = NUMBER(Workdays);
CONST A : CARDINAL = 0; VAR Value: INTEGER; (* INTEGER kezdőérték nélkül *) Char = 'F';Kifejezések, operátorok