A legegyszerűbb kifejezések a konstansok. A logikai konstansok a true
és a false. Az egész szám konstansok számjegyek előjelnélküli
sorozata. A karakterlánc konstansok karakterek sorozata idézőjelek közé zárva.
Ezek maximum 1024 karakter hosszúak lehetnek.
A konstansok a Bool, Int és a String
osztályokhoz tartoznak. Egy konstans értéke a megfelelő osztály egy
objektuma.
A lokális változók, a formális paraméterek, a self és az
osztály attribútumok azonosítók. Attribútumot nem hozhatunk létre self azonosítóval.
A lokális változók és a formális paraméterek lokális láthatósággal
rendelkeznek. Az attribútumok az egész osztályban láthatóak, feltéve, hogy más
változó nem fedi el őket.
Egy értékadásnak
<azonosító> <- <kifejezés>
formája van. A kifejezés statikus típusa meg kell feleljen az azonosító deklarált típusának. Az utasítás értéke kifejezés értékével egyezik meg, statikus típusa kifejezés statikus típusa.
Cool-ban háromféle eljáráshívás van. Ezek abban különböznek, hogy hogyan választjuk ki a hívott metódust. A leggyakrabban a
<kifejezés>.<azonosító>(<kifejezés>,...,<kifejezés> )
formát használjuk. Először az argumentumokat balról
jobbra kiértékeli a rendszer, majd a . előtti kifejezés
típusát is meghatározza. Ha ez void, akkor futásközbeni hiba lép fel. Egyébként
a típus osztályának azonosító nevű metódusa kerül meghívásra a
kiértékelt kifejezésekkel, a self változóhoz pedig a . előtti kifejezés értékét kell rendelni. Az
egész kifejezés értéke a metódus által visszaadott érték.
Ha a metódus által visszaadott érték a SELF_TYPE, akkor a
kifejezés típusa a . előtti kifejezés típusa
lesz, egyébként a metódus definíciójában megadott. A
<azonosító>(<kifejezés>,...,<kifejezés> )
forma a
self.<azonosító>(<kifejezés>,...,<kifejezés> )
forma rövidítése. A
<kifejezés>@<típus>.<azonosító>(<kifejezés>,...,<kifejezés> )
forma segítségével elérhetünk olyan, a szülőben
definiált metódusokat, melyeket a gyermekben elfedtünk. Természetesen ekkor az
@ jel baloldalán álló kifejezés típusának meg kell felelnie a típus-
nak.
A . előtt álló kifejezés statikus típusának rendelkeznie kell a hívott
eljárással és a paraméterek statikus típusának illeszkedni
kell a hívott metódus formális paramétereinek típusára. (A feljebb definiált >= reláció szerint:
paraméter statikus típusa >= formális paraméter
típusa
A feltételes elágazás formája a következő:
if <kifejezés> then <kifejezés> else <kifejezés> fi
A szemantika a szokásos. Először az if utáni kifejezés kiértékelése történik meg (ennek Bool statikus típusúnak kell lennie). Ha true, akkor a then ágat választjuk, egyébként az else ágat. Az utasítás értéke a megfelelő ág értékével egyezik meg. Mivel az ágak tetszőleges típusúak lehetnek, így a feltételes elágazás típusa a két ág típusának legközelebbi közös őse lesz. Ez végső esetben az Object. Ennek jelölésére bevezetjük a típusokon értelmezett műveletet. Legyen A, B, C és D tetszőleges típus (de nem SELF_TYPE). A legkisebb típusa típusok egy halmazának az az eleme, amelynél minden más típus >= a halmazban (a típusokon értelmezett >= reláció szerint).
A B = |
az a legkisebb C típus, melyre C >= A és C >= B (vagyis A és B legkisebb közös öse) |
SELF_TYPED SELF_TYPED = |
SELF_TYPED |
SELF_TYPED A = |
D A |
A SELF_TYPED = |
A D |
Legyen T és F a statikus típusa az elágazás ágainak. Ekkor az elágazás típusa T F lesz.
A ciklus formája a következő:
while <kifejezés> loop <kifejezés> pool
A ciklus minden lefutása előtt megtörténik a while utáni kifejezés kiértékelése (ennek Bool statikus típusúnak kell lennie). Ha false, akkor a ciklus terminál. A ciklus statikus típusa Object .
A blokk formája a következő:
begin <kifejezés>;...,<kifejezés>; end
A kifejezés-ek balról jobbra értékelődnek ki. Minden blokknak
legalább egy kifejezés-e van. A blokk értéke az utolsó kifejezés
értéke, statikus típus az utolsó kifejezés típusa.
A pontosvessző mint terminátor használható.
A let utasítás a következő alakú:
let <azonosító1> : <típus1> [ <- <kifejezés1> ], ... <azonosítón> : <típusn> [ <- <kifejezésn> ] in <kifejezés> end
Lehetőség van a változóknak kezdeti értéket adni. Ha van kezdeti érték,
akkor azok balról jobbra értékelődnek ki. A let utasítás
értéke a kifejezés értékével egyezik meg. A megadott változók csak a let
utasítás törzsében láthatóak.
Az azonosító1, ..., azonosítók változók
felhasználhatóak az azonosítóm változó értékadásakor, ha m > k.
Ha egy azonosító többször fordul elő, akkor az utolsó elfedi a többit. A
bevezetett változók minden azonos nevű változót elfednek. Minden let
utasításnak legalább egy változót kell deklarálnia.
A let utasítás típusa kifejezés típusa.
A
case <kifejezés0> of
<azonosító1> : <típus1> => <
EM> <kifejezés1>
...
<azonosítón> : <típusn> => <
EM> <kifejezésn>
esac
utasítással valósíthatunk meg többirányú elágazást.
Ez futásidejű típusellenőrzést tesz lehetővé. Először kifejezés0 értékelődik
ki, majd az értéke típusának legközelebbi ősének típusk ágát kell
választani. Ekkor az azonosítók értéke kifejezés0 értéke
lesz, és kifejezésk kerül kiértékelésre. A case értéke
kifejezésk értéke. Ha nem lehet ágat kiválasztani, vagy kifejezés0
típusa void, akkor futásidejű hiba lép fel.
Minden case utasításnak legalább egy ága kell
legyen. A case utasítás statikus típusa a kifejezési kifejezések
legközelebbi közös őse.
Nincs default ág, de a
x : Object => ...
utasítás nyílván hasonló értelmű.
Objektumot a
new <típus>
utasítással hozhatunk létre. Az utasítás statikus típusa típus .
Az
isvoid <kifejezés>
utasítás true-t ad, ha a kifejezés típusa void .
A Coolban 4 bináris aritmetikai művelet van. Ezek a +, a -, a * és
a /.
Az operandusok statikus típusa Int
kell legyen, az eredmény típusa is Int lesz.
3 bináris összehasonlító művelet van. Ezek a <, a <= és az =.
A < és a <= operandusai is csak Int-ek
lehetnek, az eredmény Bool típusú. Az = művelet esetén ha valamelyik operandus Int, Bool
vagy String típusú, akkor a másiknak is annak kell
lennie. Nem alap objektumok esetén pointer egyenlőséget vizsgál a rendszer.
Unáris operátor kettő van. Ezek a ~, amely a komplemensét adja az Int statikus típusú operandusnak
és a not, amely a< STRONG >
Bool< /STRONG> típusú operandus logikai ellentettjét adja.