A TACL programozási nyelv

Alprogramok, modulok

Alprogramok, modulok

Szintaxis

A nyelv kétféle módon tud működni. Az egyik, amikor un. makrót írunk, ilyenkor csak olyan programot írhatunk, ami nem ad vissza visszatérési értéket. A másik esetben un. routine-t írunk, ekkor adhatunk vissza visszatérési értéket. Lehetőség van mindkét esetben belső vagy akár külső szubrutinok hívására. Egyetlen kikötés, mivel interpreteres nyelvről van szó, hogy hivatkozás előtt már ismernie kell a hívandó szubrutint, vagyis előbb kell deklarálnunk a szubrutint, mint a hívó rutint/parancsot.

TACL-ban minden parancsnak és eljárásnak van visszatérési értéke. Ezzel jelzi a rendszer, hogy sikeresen zajlott-e le az adott parancs futtatása. A visszatérési érték normál esetben –1, egyébként nulla. TACL terminológia szerint egy parancs kifejtése (expand) történik a parancs végrehatása során, és ennek a kifejtésnek a sikerességét mutatja ez a visszatérési érték. A #result kulcsszóval tudjuk explicit módon megmondani a visszatérési éréket.

Paraméterátadás

Paraméter átadásnak is két módja van, attól függően, hogy éppen melyik módon használjuk az interpretert. Makró esetén %n%, n egészszám jelenti az n-dik paramétert a paraméterlistában, ezt egyszerű mintahelyettesítéssel veszi át. A másik mód csak program (=routine) módban működik. Ekkor az #argument parancs segít a paraméterek átvételében és helyességük vizsgálatában. Egy szubrutin elején az #argument segítségével tudjuk megmondani, hogy az adott paraméterlistabeli elemeket hogyan vegyük át – ui. a TACL alapértelmezés szerint levágja a szélső space-eket, így „ ez „ ugyanaz, mint „ez”, de paraméter átvételkor mondhatjuk, hogy az előbbi kettő különböző legyen –, az adott paraméter milyen típusú kell hogy legyen. Az #argument tulajdonképpen azt csinálja, hogy a paraméterlista elemein végig menve megmondja, hogy az általunk megadott típuslista mely elemének felel meg. Ezért az #argument visszatérési értéke a helyesen átvehető típuslistabeli pozíció. Azt is megtehetjük, hogy az #argument által a léptetésre használt pointert visszaállítsuk az elejére, ugyanis csak egyszer megy végig a paraméterlistán, és közben fogyasztja a paramétereket. A paraméterek típusára több mindent is kiköthetünk egyszerre: filename, end stb. Ha nem az #argument által meghatározott típusú paraméter van az adott pozíción, akkor hibaüzenet mellett megáll a program.


Példák:

[#def <név> routine |body| <törzs>]

Így lehet belső szubrutin deklarálni, név névvel hivatkozhatunk rá később. Mivel a változók globálisak, ezért érdemes a törzsben #frame/#unframe párt használni a lokálisnak szánt változókhoz.

1. [#def <név> routine |body|
<törzs>
#result <visszatérési érték>
]

2. #output [név paraméterlista]

Ebben az esetben a 2. pont végrehajtásakor meghívódik a név szubrutin a paraméterlistával. Ezt a paraméterlistát a szubrutin megkapja, végrehajtja törzset, majd a visszatérési értékkel tér vissza. A szubrutin kifejtésének eredménye ez a visszatérési érték lesz, ez fog megjelenni a képernyőn.

Paraméterátadás:

#argument /<mód> <val>/ <típus lista>

A val változónak már léteznie kell az #argument kiértékelése előtt. A mód lehet: TEXT, VALUE, PEEK. TEXT esetén a változó a szélső white space-ek nélküli értéket kapja meg, VALUE esetén mindent, a white space-eket is. PEEK esetén a típuslista pointer nem mozdul, ui. minden más esetben egy paramétert csak egyszer lehet kiértékelni, szépen végig megy a lehetséges típusokon. Ha valamelyik típusra illeszthető, akkor ennek a típusnak a típuslistabeli pozíciójával tér vissza az #argument. Pl.:

[#def sub routine |body|
[#case [#argument /TEXT val/ FILENAME END]
|1| == létező file a paraméter
|2| == nincs több paraméter, akár paraméter nélkül is hívhatjuk a szubrutint
]
]
sub
sub lista

Mindkét módon hívhatjuk a sub szubrutint, az első esetben az #argument értéke 2, a második esetben – ha létezik a lista file – 1 lesz. A #more parancs tartalmazza a paraméterlista még hátralévő elemeit. Amíg nem üres a #more lista, addig van feldolgozandó paraméter. Pl.:

[#def sub1 routine |body|
#push val
[#loop |while| [#more] |do|
[#case [#argument /TEXT val/ NUMBER FILENAME]
|1| #output Ez egy szám: [val].
|2| #output Ez egy létező file: [val].
]
]
1. sub1 1 lista 2
2. sub1 3 4
3. sub1

A sub1 szubrutin a következőt csinálja: amíg van elem a paraméterlistában, addig veszi a paramétereket, megpróbálja illeszteni a típuslista elemeire, ha talált egy illeszkedő típust, akkor végrehajtja a megfelelő törzset. Automatikusan törli a paraméterlistából a feldolgozott paramétert, és veszi a következőt, ha van még. A futás eredménye:

Első esetben:

Ez egy szám: 1.
Ez egy létező file: lista.
Ez egy szám: 2.

Második esetben:

Ez egy szám: 1.
Ez egy szám: 3.
Ez egy szám: 4.

Harmadik esetben nem ír ki semmit a képernyőre, mert üres a paraméterlista.

Túlterhelés

Kidolgozásra vár.

Rekurzió

Kidolgozásra vár.