Az adattípusok
A Cecil biztosít egy statikus típusrendszert, ami a dinamikus típusrendszerre épül. A típusrendszer fő jellemzői:
A típus deklarációk egy példányváltozóban tárolt, vagy egy metódus visszatérési értékeként adott objektumtól elvárt felületet írnak le.
Az argumentum specializációk a metódusokban különböznek a típus deklarációktól.
A kódöröklés külön válhat az altípusosságtól, de az általános eset, amikor a két elvárás párhuzamos, támogatott.
A típusellenőrző statikusan tudja vizsgálni, hogy egy üzenet nem egyértelműen adott.
A statikus típusrendszer statikusan tud ellenőrizni, nem úgy, mint a dinamikus típusrendszer.
A Cecilben a típus egy absztrakciója az objektumnak. A típus egy gép által ellenőrizhető felületet, és egy benne foglalt, de nem ellenőrzött viselkedési leírást tartalmaz. Minden objektum, ami megfelel a típus specifikációnak, támogatnia kell a típus interface-ét, és teljesítenie kell a viselkedési elvárásokat. Egy típus állíthatja, hogy ő egy altípusa egy másiknak. Ez esetben minden objektum, ami megfelel az altípusnak, az meg kell, hogy feleljen a szupertípusnak is. Az interface megfelelését ellenőrzi a típusellenőrző rendszer, de hogy a viselkedés is megfelel az altípusosság elvárásainak, azt a programozónak kell biztosítania. Lehetséges több szupertípus megjelölése.
A szignatúra a Cecilben túlterhelt metódusok gyűjteményének az absztrakciója, ami egy felületet (név, argumentumtípusok sorozata, visszatérési érték), és egy benne foglalt, de nem ellenőrzött viselkedési specifikációt tartalmaz. A típus interface-éhez tartozik minden olyan szignatúra, ami tartalmazza a típust mint egy argumentum típusát, vagy visszatérési érték típusát.
Például:
type int_list subtypes int_collection;
signature is_empty(int_list):bool;
signature length(int_list):int;
signature do(int_list, &(int):void):void;
signature pair_do(int_list, int_list, &(int,int):void):void;
signature prepend(int, int_list):int_list;
A típusok, és szignatúrák egy szerződést írnak le a felhasználók, és az implementálók között, ami lehetővé teszi, hogy az üzenetküldések típusellenőrzöttek legyenek. Egy szignatúra megléte lehetővé teszi a felhasználók számára, hogy olyan üzeneteket küldjenek, aminek argumentumaiban a szignatúrában szereplő argumentumtípusok altípusai szerepelnek, és biztosítja, hogy visszatérési értékként egy, a visszatérési érték típusaként megadott típus altípusa lesz. A szignatúrát megvalósító metódusok halmaza megfelelő, teljes és ellentmondásmentes kell, hogy legyen.
- A megfelelés azt jelenti, hogy az implementáló metódusnak specializálatlan argumentumai vannak, aminek típusai szupertípusai a megfelelő argumentum típusoknak, és a visszatérési értékként adott típus altípusa a szignatúrában adottnak.
- A teljesség azt jelenti, hogy a metódusnak minden olyan argumentumra helyesen kell működnie, ami futásidőben aktuális paraméterként adható neki a szignatúra alapján.
- Az ellentmondás-mentesség azt jelenti, hogy a metódusoknak egyértelműnek kell lenniük minden lehetséges futásidejű argumentumra.
A típusok megadásának szintaxisa:
tp_decl ::= [type_cxt] [privacy] “type” name [formal_params]
{type_relation} [type_cons] “;” declares an object type
object_decl ::= [type_cxt] [privacy] rep_role rep_kind name
[formal_params] {relation} [type_cons]
[field_inits] “;”
rep_role ::= “abstract”
only inherited from by named objects, allowed to be incomplete
| “template”
only inherited from or instantiated, uninitialized fields allowed
| “concrete” completely usable, must be complete and initialized
| [“dynamic”] completely usable accesses checked dynamically
rep_kind ::= “representation” declares an object implementation
| “object” declares an object type and implementation
type_relation ::= “subtypes” type_patterns
relation ::= type_relation
type subtypes from type, or impl conforms to type
| “inherits” parents impl inherits from impl
| “isa” parents impl inherits from impl, type subtypes from type
parents ::= named_object_p { “,” named_object_p }
field_inits ::= “{“ field_init { “,” field_init } “}”
field_init ::= msg_name [location] “:=” expr
location ::= “@” named_object