A TOM programozási nyelv

Metódusok

Egy metódusnak kötelezően van neve, argumentuma(i), visszatérési típusa. Tehát minden metódus gyakorlatilag függvény, mint a C-ben. Az alprogram neve állhat több részből is, de minden rész után kell paraméternek állnia. Például a következő eljárás neve multiply by:

int multiply a by int b; { return a * b; }

Ennek az eljárásnak két paramétere van, két int típus és a visszatérési típusa is int. A két paraméter szorzatával tér vissza. A következő program az eljárás működését szemlélteti:

int main Array argv
{ int i, n = [argv length], result = 1; for (i = 0; i < }; i++) { String s = [argv at i]; result = [self multiply result by [s intValue]]; } [[[stdio out] print result] nl]; return 0; }

Tuple-k

Azokban az esetekben, amikor egy metódusnak több visszatérési értéke van, a TOM nyelv a tuple használatát kínálja. Egy példa egy metódusra, ami tuple-t használ a substring metódus a String osztályból.

String substring (int, int) (start, length);

Ennek a metódusnak a (start, length)tuple az argumentuma.

A következő példa szemléltet működés közben egy futó szöveget.

int main Array argv { String text = "Testing... 1 2 3", spaces = " "; int len = [spaces length], finish = len + [text length]; int num = (![argv length] ? 100 : [argv[0] intValue]); int i, count; for (count = 0; count < num; count++) for (i = 0; i < finish; i++) { if (i < len) { /* 1. eset: Space-ek utan a szoveg eleje. */ [out print [spaces substring (0, len - i)]]; [out print [text substring (0, i)]]; else if (i < finish - len) /* 2. eset: Kezdi es befejezi a sort a szovegben. */ [out print [text substring (i - len, len)]]; } else { /* 3. eset: Szoveget koveto space-ek. */ [out print [text substring (i - len, finish - i)]]; [out print [spaces substring (0, len - (finish - i))]]; } /* Visszamegy a sor elejere. */ [out print '\r']; } = 0; }

Egy példa tuple-t visszaadó metódus az Enumerator. Egy Enumerator használható arra, hogy megfordítsa az objektumok sorrendjét. Az enumerator gyűjteményének bekérése után a metódus

(boolean, Any) next;

használható arra, hogy ismétlődően helyrerakja a következő objektumot. A next által visszaadott érték egy tuple egy boolean–al és egy objektummal. Ha a boolean TRUE, a tuple második eleme tartalmazza a keresett objektumot. Ha FALSE, akkor a gyűjtemény végére értünk.

int main Array argv { Enumerator e = [argv enumerator]; Any object; while ({ boolean valid; (valid, object) = [e next]; valid; }) [[[stdio out] print ("got one: `", object, '\'')] nl]; return 0; }

Visszatérési értékek

Az eddigi példákban a „return ” utasítással adtuk meg az alprogram visszatérési értékét. Ezzel a metódus futása is befejeződik, akárcsak C-ben. Pl:

{ ... int result = [self computation]; [self deallocateResources]; return result; }

Van más mód is a visszatérési érték megadására. Baloldal nélküli értékadással beállíthatjuk az alprogram visszatérési értékét, anélkül, hogy a futása befejeződne. Pl.:

{ … = [self computation]; [self deallocateResources]; }

Ha egy alprogramban nem adunk meg visszatérési értéket, akkor automatikusan a visszatérési típus alapértelmezett értékével tér vissza. Például a két program ekvivalens:

boolean constantp { boolean v; = v; } boolean constantp { }

Tuple típusoknál a visszatérési értéket alapesetben minden mezőre meg kell adni. Pl.:

{ … = (a, b); … }

Ezt elkerülendő, lehet alkalmazni névvel ellátott visszatérési típusokat. Ilyenkor a visszatérési értéket úgy lehet kezelni, mint egy lokális változót. A nevet mindenképp zárójelbe kell tenni. Ha csak egy változó a visszatérési érték, akkor úgynevezett „singleton tuple” –ként kell megadni a nevet. Pl.:

(bool, Any) (valid, object) next } valid = [self haveMoreObjects]; if (valid) object = [self getNextObject]; }

Ha a visszatérési érték és a paraméterek nevei között átfedés van, akkor gyakorlatilag eredmény szerinti paraméter-átadást alkalmaz a nyelv. Azaz a paraméterként kapott változó, mint lokális változó szerepel az alprogram törzsében. Majd a visszatérési érték automatikusan a változó értéke lesz. Pl.:

int (value) echo int value { }

Ez az eljárás semmi mást nem csinál, csak a paraméterként kapott int típusú váltózó értékével tér vissza.