A Tcl programozási nyelv

Alprogramok, modulok



Szintaxis

A Tcl programozási nyelvben a proc paranccsal definiálhatunk eljárásokat.

proc név arg törzs
A proc név néven olyan parancsot hoz létre, amelynek végrehajtását a törzs script definiálja. Ha már létezik az adott néven parancs, az új definíció lép a régi helyébe. A proc parancs üres stringet ad vissza.

Paraméterátadás

A formális paramétereket az arg argumentum specifikálja. Az arg egy lista, melynek minden eleme egy formális paramétert ír le. Egy formális paramétert egy egy- vagy kételemű lista ad meg. Az első listaelem a formális paraméter neve, az opcionális második pedig az alapértelmezés szerinti értéke. Az utolsó formális paraméter neve lehet a különleges jelentésű args, hozzá alapértelmezés nem adható meg.

Az eljárás meghívásakor a formális paraméterek lokális változóként jönnek létre, vagyis érték szerinti paraméterátadás valósul meg. Kezdőértékük a sorrendben nekik megfelelő aktuális paraméter, ennek híján az alapértelmezés szerinti érték lesz. Az aktuális paramétereknek le kell fedniük az alapértelmezéssel nem rendelkező formális paramétereket. Ha az utolsó formális paraméter az args, a formálisnál több aktuális paraméter is megadható, az args értéke ekkor olyan lista, amely a "maradék" aktuális paramétereket tartalmazza.

Az eljárástörzs végrehajtása során alapértelmezésben a globális változók nem láthatók, a hivatkozott változók lokálisak. Akkor jönnek létre, amikor először értéket adunk nekik, és az eljárás elhagyásakor automatikusan törlődnek. Nem lokális változókat a global és az upvar parancsok segítségével érhetünk el.

Az eljárás végrehajtása return paranccsal vagy a törzs utolsó parancsának végrehajtása után ér véget. A visszatérési érték előbbi esetben a return parancsban megadott string, utóbbi esetben pedig a törzs utolsó parancsának eredménye lesz.

global változónév ?változónév ...?
A global deklaráció jellegű parancs. Egy eljárástörzsben kiadva, a felsorolt változónevek az eljárás befejezéséig az azonos nevű globális változókra hivatkoznak. Visszatérési értéke üres string.

upvar ?szint? hivatkozott változónév ?hivatkozott változónév ...?
Az upvar parancs a global általánosítása, tetszőleges eljáráshívási szinten elhelyezkedő változóhoz rendelhetünk vele nevet. A relatív szintet nemnegatív egész szám adja meg, 0 az aktuális szintet, 1 az eljárást hívó szintjét, 2 a hívót hívó szintjét, és így tovább, jelenti. Abszolút szintre '#' karakterrel prefixelt számmal hivatkozhatunk, például #0 a globális szintet jelöli. A szint elhagyható, ha az első argumentum nem számjeggyel vagy kettőskereszt karakterrel kezdődik. Hivatkozott lehet egyszerű változó, tömb vagy tömbelem, de változónévnek egyszerű változónévnek kell lennie.

Az upvar-ral létrehozott változónév teljes értékű alternatívája az eredeti változónévnek. Például a hivatkozott változó (vagy tömbelem) az első értékadásnál jön létre, ha még nem létezik. Az unset parancs is magát a hivatkozott változót törli, nem a hivatkozást. A hivatkozás nem is szüntethető meg az eljárás elhagyása nélkül, legfeljebb átirányítható újabb upvar paranccsal.

Az upvar az egyetlen lehetőség, hogy hivatkozás szerinti paraméterátadást szimuláljunk Tcl-ben. Ehhez a hivatkozni kívánt változó nevét paraméterként átvesszük, majd egy upvar utasításban kapcsolatot teremtünk a változóval:

proc decr {name {value 1}} {
    upvar 1 $name $name
    incr $name [expr - $value]
}
Nem okoz gondot - így fenti példában sem -, ha a hivatkozott változó neve a megadott szinten maga is global vagy upvar paranccsal létrehozott hivatkozás, hiszen ezek egyenértékűek a hivatkozott változó eredeti nevével.