A Cecil programozási nyelv

Alprogramok (metódusok)

Alprogramok (metódusok)

A Cecil metódusai nem objektumokhoz kötöttek. Az argumentumokat specifikációban kell jelölni, de ezek az argumentumok lehetnek “specializáltak”, vagy “nem specializáltak”, valamint lehet típusuk megadva (ezekre kicsit később visszatérek). Így nem lesz kiemelt szerepe a metódus első argumentumának. Legjobb példa erre az “=” (egyenlőség vizsgálat). Itt mindkét argumentumnak azonos szintű a szerepe, mégis a programozási nyelvek többségében az első argumentumhoz kötött ez az operáció.

Mivel a nyelvben lehetőség van metódusok túlterhelésére, és többszörös öröklődésre is, ezért érdekes lehet, hogy hogyan állapítja meg a fordító, hogy melyik metódust kell meghívni egy konkrét esetben.

A metódus kikeresési mechanizmus:

A Cecil metódus kikeresési mechanizmusa egyfajta implementációja a Touretzky-féle következtetéses távolság heurisztikának, ahol a gyerekek felülírják a szüleiket. A metódus kikeresés a program öröklési gráfját dolgozza fel, mint egy parciálisan rendezett objektumokat tartalmazó gráfot, ahol az, hogy valami kisebb, azt jelenti, hogy jobban specifikált: az A objektum akkor, és csak akkor kisebb, mint a B objektum, ha az A a B egy felmenője. Ez az objektumokon értelmezett rendezés analóg rendezést eredményez azokon a metódusokon, amelyek az objektumokra vannak specializálva. A parciális rendezésben két azonos névvel és argumentum számmal rendelkező M és N metódus közül M kisebb mint N akkor, és csak akkor, ha minden argumentuma egyenlő, vagy kisebb (leszármazottja), mint N megfelelő argumentumai. Mivel nem lehetséges, hogy azonos nevű, és argumentum számú metódusnak ugyanazok legyenek az argumentum specializációi, ezért legalább egy argumentumban szigorúan kisebbnek kell lennie M-nek, mint N-nek. Egy nem specializált argumentum az any objektumra specializáltként van kezelve, ami minden más objektumnak ős-objektuma. A metódusok ezen rendezése parciális, mivel előfordulhat a többértelműség.

Ezek után a metódus kikeresés egyszerű. Egy adott üzenet esetében a rendszer megkonstruálja az egyező nevű, és paraméterszámú metódusok parciálisan rendezett listáját. Ezek után eldobja azokat, amelyek argumentumainak specializációja nem egyezik, vagy ősei az aktuális argumentumoknak. Ha nem marad a listában metódus, akkor egy “message not understood” üzenetet ad a rendszer. Ha több, mint egy metódus marad, de nincs egy olyan köztük, ami szigorúan kisebb az összes többinél, akkor egy “message ambigous” üzenetet ad a rendszer. Különben pontosan egy üzenet marad a listában, és ezt adja vissza.

A metódusok deklarációjának szintaxisa:

method_decl ::=“method” method_name “(“ [formals] “)” {pragma}
  “{“ (body | prim_body) “}” [“;”]
method_name ::= msg_name | op_name
msg_name ::= name
formals ::= formal { “,” formal }
formal ::= [name] specializer    formal names are optional, if never referenced
specializer ::= “@” named_object specialized formal
  | empty                        unspecialized formal