A Cecil programozási nyelv

Az adattípusok

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 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 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