A TOM programozási nyelv

Kifejezések

Kommentek

A TOM három alapvető fajta lehetőséget biztosít a kommentezésre.

/* C típusú komment */ a két jel között tart

// C++ típusú komment, sor végéig tart

<doc> Dokumentációs komment </doc> a két jel között tart

Konstansok

Az egész számoknak int a típusa, ha elfér az int tartományában, különben long. Ha ebbe se fér bele, akkor hibaüzenetet küld a fordító. A konstans elé írt l vagy L betűvel kényszeríthetjük arra, hogy long típusú legyen a konstans. A 0-val kezdődő konstansokat oktálisnak tekinti, ill. a 0x-el kezdődőeket, pedig hexadecimálisnak. A hexadecimális számjegyek nem nagybetű-érzékenyek. A karakterek ’ jel között byte-tá konvertálódnak (az ASCII- kódjuk alapján).

A tizedespontot tartalmazó számok float típusúak, amennyiben elférnek benne. Ha nem, akkor double, ha ebbe sem fér el, akkor hibaüzenetet ad a fordító. A konstans után írt „d” betűvel kényszeríthetjük a fordítót, hogy double típusú legyen a szám.

Operátorok

A TOM nyelvben 1, 2 ill. 3 operandusú operátorok vannak. Az operátoroknak természetesen van prioritásuk. Szintaktikájuk nagyon hasonlít a C nyelvéhez. Amiben eltér tőle; az -> implikáció operátor és a >>> logikai jobbra-tolás operátor. Lusta kiértékelést végez a nyelv, tehát ha egy logikai kifejezés elejéből már meg tudja állapítani a kifejezés egészének értékét, akkor nem értékeli ki végig azt.

Az operátorok jelentése és prioritása az alábbi táblázat mutatja be (a legmagasabb prioritásúaktól haladva a kisebbig):

Operátor

Aritás

Asszociativitás

Leírás

++, --

1

jobboldali

Növelés, csökkentés

-, ~, !

1

jobboldali

Negálások

*, /, %

2

baloldali

Szorzás, osztás, moduló

+, -

2

Baloldali

összeadás, kivonás

<<, >>

2

Baloldali

Aritmetikai eltolás

>>>

2

Baloldali

Logikai jobbra tolás

&

2

Baloldali

Bitenkénti és

|

2

Baloldali

Bitenkénti vagy

^

2

Baloldali

Bitenkénti kizáró vagy

<, <=, >=, >

2

Baloldali

Rendező összehasonlítás

==, !=

2

Baloldali

Egyenlőség ellenőrzés

&&

2

Baloldali

Logikai és

||

2

Baloldali

Logikai vagy

->

2

Baloldali

Implikáció

? :

3

Jobboldali

If-then-else

=, stb.

2

Jobboldali

értékadás


Helyi változók

Minden változónak van típusa és használatuk előtt deklarálni kell. Helyi változók meghatározhatók bárhol egy összetett kifejezésben. A változó hatásköre a deklarációjával kezdődik és a tartalmazó rész végével fejeződik be.

local_var_decl: entity_type local_var_list local_var_list: local_var [',' local_var_list] local_var: identifier [ '=' expression ]

Ha a expression adott, az definiálja a változó kezdőértékét, az identifier alapján nevezve el azt, meghatározva a local_var által. Ha ez nem történt meg, a változó a típusának alapértelmezett értékét veszi fel. Pl:

int a = 11, b;


Ekkor ’a’ értéke 11 lesz, ’b’ -é pedig 0.

Ciklusok

A ciklusok formája teljesen megegyezik a C nyelvével.
Van elöl tesztelős ciklus, amely formája a következő:

while (feltétel) utasítás

Erre egy példa:

int main Array argv { float celsius = -100.0; while (celsius <= 100.0) { float fahrenheit = 32.0 + 9.0 / 5.0 * celsius; [[[stdio out] print (celsius, " ", fahrenheit)] nl]; celsius = celsius + 1.0; } return 0; }

Hátul tesztelős ciklus:

do utasítás while (feltétel)

int main Array argv { int counter; do { [[[stdio out] print counter] nl]; counter = counter + 1; } while (counter < 10); return 0; }

A for ciklus felépítése a szokásos, a C-ben megismert módhoz hasonló:

for(kezdeti érték; feltétel; növelés)

int main Array argv { float f; for (f = -100.0; f <= 100.0; f++) [[[stdio out] print (f, " ", (f - 32.0) * 5.0 / 9.0)] nl]; return 0; }

Break és continue használható.

Elágazások

A következő példa szemlélteti az if-else konstrukció használatát.

int main Array argv { int n = [argv length]; if (n == 0) [[[stdio out] print "no arguments"] nl]; else [[[stdio out] print (n, " arguments")] nl]; }

Ha ez a program argumentumok nélkül kerül meghívásra, az Array argv üres lesz, és 0-t ad vissza a hosszának. így a program válasza no arguments lesz. Ha legalább egy argumentummal hívjuk meg, az argv-ben lévő elemek számát adja válaszként.

Csak egy 3 operandusú operátor van a TOM nyelvben, ? : , amit az if-then-else operátorként is számontartanak. Pl. a > b ? a : b esetén ha a nagyobb, mint b, akkor a kifejezés a-t adja vissza eredményként, egyébként b-t. Egy x ? y : z kifejezés esetén x-nek boolean-nak kell lennie, valamint y és z típusának meg kell egyeznie. y és z közül csak az egyik fog kiértékelődni.

Implicit konvertálás

Minden típus pontosan megfelel saját magának; szűk integer típusok megfelelnek a bővebb integer típusoknak; egy alosztály passzol bármelyik ősosztályával; és egy tuple illeszkedik egy másik tuple-ra ha az elemeik száma megegyezik és a tartalmazott elemek megfelelnek.

Explicit konvertálás

Explicit konverzió két okból létezik: hogy lehetővé tegye az implicit konverziók explicitté tételét és hogy implicit módon nem kivitelezhető konverziókat megvalósíthatóvá tegyen.

type_conversion: entity_type '(' expression ')';

Engedélyezett explicit konverzió valamennyi konverzió, ami