A Theta-ban két fajtája van a rutinoknak. A procedúrák egy vagy több objektum összességét adják vissza. Az iterátorok adatok sorozatát adják vissza (ahol egy adat, egy vagy több objektum összessége), egyidőben egy adatot. Iterátort hívni (csak) egy for ciklusban lehet, és a for ciklus törzsét végrehajtja minden adatra a sorozatban.
Egy rutin hívása során a rutin végrehajtódik az argumentumában szereplő objektumokkal. Ebben a fejezetben megtárgyaljuk a hívási mechanizmus egy részét, ami közös a procedúráknál és iterátoroknál egyaránt (és maker-eknél is).
A egyedül álló rutinokat a specifikációval definiáljuk; Így a specifikációk paraméterezhetjük, ily módon példányosíthatunk egy rutint. Rutinokat kifejezések kiértékelésével is kaphatunk. Például, ha egy rutin úgy kapunk meg, hogy kiválasztjuk az objektum egy metódusát, vagy megadunk egy rutint néhány aktuális argumentummal.
A hívások a következő formával rendelkeznek:
<invoc> -> <expr0> "(" [<args>] ")"
ahol
<args> -> <expr> ["," <expr>]* ["," <varying_args>] | <varying_args>
<varying_args> -> .. | .. <expr> ["," <expr>]*
A "varying_args" forma megengedi, hogy változó számú argumentuma legyen. Ezek az argumentumok együtt egy sorozat elemeit alkotják, amik a hívás (legutóbbi) legutolsó hívásának aktuális argumentumai, és a forma csak akkor megengedett, ha egy rutin hívásakor ezek az argumentumok sorozatot alkotnak.
Egy hívásnál végrehajtásánál végrehajtódó tevékenységek sorozata a következő:
A hívás pontosan azokban az esetekben megengedett, amikor a formális és aktuális argumentumok száma megegyezik (miután létrehoztuk a "varying_arg"-ból a sorozatot), és az aktuális kifejezések hozzárendelése a formálisokhoz megengedett.
Például, ha a "p" procedúra a következő szignatúrával rendelkezik:
akkor ezek a hívások megengedettek:
A hívó és hívott rutin csak az argumentumokon és a visszatérési értékeken keresztül kommunikál. A rutinok nem férhetnek hozzá a hívó egyetlen változójához sem.
Az aktuális argumentumok kifejezésének a formális paraméterekhez való hozzárendelése után, a hívó és a hívott rutin megosztozik az objektumokon. Ha a hívott rutin módosít egy megosztott objektumon, akkor a módosítás látható lesz a hívó számára is a visszatéréskor. A nevek arra használjuk, hogy megnevezzük a megosztott objektumokat, különbözőek a hivő, és hívott rutinban. Ha egy rutin hozzárendel egy objektumot egy formális argumentum változóhoz, akkor az nincs hatással a hívóra. A hívott rutin szempontjából az egyetlen különbség a formális argumentum változók és a saját lokális változói között az, hogy a formális változóknak a hívó ad kezdeti értéket.
Habár a fordító mindenképpen típusbiztonsággal értékel ki egy hívást, mégsem lehet biztosan meghatározni pontosan milyen kód fog végrehajtódni. Nevezetesen, egy metódus hívás esetén a fordító általában csak a nyilvánvaló (statikus) típusát tudja az objektumnak, amelynek a metódusát kiválasztottuk, és nem az aktuális (dinamikus) típusát. Amikor a kód végrehajtódik, meghatározza az aktuális típust, és a saját implementációját használja a típusnak. Emiatt a metódus hívása futási idejű üzenettel (hibával) jár.
A rutin kétféleképpen terminálhatnak: normális módon, vagy kivétellel, amit egy kivétel üzenete jelez. Ha rutin normális módon fejeződik be, akkor a visszatérési objektumok a hívó rendelkezésére állnak, és mutathat rájuk egy változó vagy továbbadódhatnak egy másik rutin argumentumaként. Ha egy rutin kivétellel feleződik be, akkor a végrehajtási folyamat átadódik egy kivételkezelőnek a hívó rutinban.