A nyelvnek egyetlen beépített típusa van: ez a szöveg. Minden változó alapértelmezésben szöveg típusú. A TACL nem tekinti különbözőnek a „ ez most egy szöveg „ és „ez most egy szöveg” szövegeket. Más típusok, mint például egészszám, a változó használatakor, dinamikusan keletkeznek. Pl. a #compute utasítás számmá alakítja a szöveges változókat, és ezen végzi el a megfelelő műveletet.
#push var1 var2
#compute [var1] + [var2] == ennek a műveletnek a kifejtése a két változó értékének összege lesz
(Van mód egyszerű rekordszerkezet megvalósítására, melynél egyszerű típusokat használhatunk, pl.: char, byte, integer. Igazából ez nem is a TACL része, hanem a TAL-nak nevezett, az assembly-hez közel álló, de vele nem teljesen azonos nyelvnek. Egy rekordon belül felüldefiniálhatunk mezőket, így lehet azonos tárterületen tárolt információt különbözőképpen elérni. Rekordon belül tudunk tömböt is definiálni.)
Létezik lista típus is, amit visszavezettek a szöveg típusra, hiszen a listaelemek felfoghatóak a szöveg szavainak.
Változó típusok
Típus | Rövid leírás |
---|---|
TEXT | Szöveget vagy TACL parancsokat tartalmaz. A szöveget tartalmazó TEXT változó a más programozási nyelvekben használatos változókra hajaz. Ha TACL parancsokat tartalmaz, akkor nincsenek argumentumai, de használható úgy, mint a MACRO típusú változó. |
ALIAS | Egy változó nevét tartalmazza. Egy ALIAS segítségével elérhetünk egy változót az alias-án keresztül is. Minden argumentum átadódik a hivatkozott funkciónak. | MACRO | TACL parancsokat tartalmaz. A makró argumentumai automatikusan kicserélődnek dummy argumentumokra, interpretálás vagy ellenőrzés nélkül a makró szövegében, minden argumentum pozíció szerinti. | ROUTINE | TACL parancsok sorozata. Egy routine fel tudja parsolni az argumentumait és ki tudja számítani a saját eredményét. | STRUCT | Bináris adatok | DELTA | TACL alacsonyszintű szövegmanipulátorhoz parancsok sorozata. Függvényként nem használható. | DIRECTORY | Változók teljes készlete. Hierarchikus felépítése van, ha funkcióként használjuk, akkor az EXECUTE változó tetejét hajtja végre. |
Kidolgozásra vár.
Kidolgozásra vár.
#push var == létre hoztuk a var nevű változót
#pop var == töröltük a var nevű változót
#push var | Itt level/frame: 1/1 |
#set var 1 | Var értéke: 1 |
#output [var] | A képernyőn megjelenik var értéke: 1 |
#push var | Itt level/frame: 2/1 |
#output [var] | A képernyőn megjelenik egy üres sor, ui. ezen a szinten var-nak nincs értéke |
#set var 2 | Var értéke: 2 |
#output [var] | A képernyőn megjelenik var értéke: 2 |
#pop var | Itt level/frame: 1/1, var értéke: 1 |
#output [var] | A képernyőn megjelenik var értéke: 1 |
#pop var | Itt töröltük a var nevű változót |
Egy #frame/#unframe pár között deklarált változókra az #unframe után automatikus #pop hajtódik végre.
#frame | Itt kezdődik a frame |
#push var | Level/frame: 1/1 |
#set var 11 | Var értéke: 11 (első keret/első szint) |
#push var | Level/frame: 2/1 |
#set var 12 | Var értéke: 12 (első keret/első szint) |
#frame | Itt kezdődik a második frame |
#push var | Level/frame: 3/2 |
#set var 21 | Var értéke: 23 (második keret/első szint) |
#unframe | Vége a második frame-nek level/frame-je: 2/1 |
#output [var] | A képernyő var értéke jelenik meg: 12 |
#unframe | vége az első frame-nek |
#output [var] | A képernyő hibaüzenet jelenik meg: nincs már var nevű változónk, így annak értékét nem is tudja megjeleníteni. Az azonos frame-ben deklarált összes változó felszabadul! Tehát az elején kétszer deklarált var közül is mind a kettő megszűnik. |
Természetes lehetőség van explicit módon az adott szinten lévő változóra – és annak értékére – hivatkozni. Például:
#push var | Var deklarálása |
#set var 1 | Var értéke: 1 |
#push var | Var újbóli deklarálása |
#set var 2 | Var értéke: 2, de alatta 1 |
#output [var.1] | A képernyőn megjelenik az egyes szinten lévő var értéke: 1 |
#output [var.2] | A képernyőn megjelenik a kettes szinten lévő var értéke: 2 |
#output [var.0] | A képernyőn megjelenik az aktuális szinten lévő var értéke: 2 |
#output [var.-1] | A képernyőn megjelenik az aktuális szint alatt lévő var értéke: 1 |
Mint látszik a példából lehetőség van arra, hogy abszolút és relatív módon címezzük a szinteket.
Van még egy érdekes tulajdonsága a TACL változóknak. A változók nem csak horizontálisan tartalmazhatnak értékeket, hanem vertikálisan is. Tulajdonképpen a változók igazi szövegként viselkednek, vagyis sorokba tördelhetőek. Pl.:
elso |
masodik |
harmadik |
A var kifejtésekor ezt a három egymás alatti sort kapjuk. A változók tartalma horizontálisan max. 239 byte-ot tartalmazhat, ugyanis minden text file-ban a sorok automatikusan sorszámozva vannak, és ezt a sorszámot is eltárolja az adott sor. Max. 99999 sor lehet egy text file-ban. A memóriaváltozók tulajdonképpen a text file-nak felelnek meg. Ez a tulajdonság abból ered, hogy Tandem gépen igazából nincs különbség a fizikai és a memóriabeli file fogalma alatt. Csak file fogalom létezik, minden file-ként van értelmezve: ezek lehetnek fizikai file-ok, változók, processzek. Ugyanúgy másolhatóak, mozgathatóak, törölhetőek stb.
TACL-ben egy kifejezés lehet szöveg, string, egész konstans, egy változó, vagy érték, amit konstansok/változók kombinálásával nyerünk, más kifejezések, amik operátorokat tartalmaznak.
A következőkben tekintsük át az operátorokat. Négy főbb kategóriába sorolhatók, amik a következők:
Az operátorok funkciója, precedenciája (minél kisebb a szám, annál magasabb (0 a lehető legkisebb érték)) a következő táblázatban található
Operátor | Funkció | Típus | Precedencia |
---|---|---|---|
NOT | Negáció | Logikai | 0 |
* | Multiplikáció | Aritmetikai | 1 |
/ | Osztás | Aritmetikai | 1 |
+ | Összeadás | Aritmetikai | 2 |
- | Kivonás | Aritmetikai | 2 |
> | Nagyobb, mint | Relációs (egészekre) | 3 |
< | Kisebb, mint | Relációs (egészekre) | 3 |
>= | Nagyobb egyenlő, mint | Relációs (egészekre) | 3 |
<= | Kisebb egyenlő, mint | Relációs (egészekre) | 3 |
= | Egyenlőség, mint | Relációs (egészekre) | 3 |
<> | Nem egyenlőség | Relációs (egészekre) | 3 |
'+' | Konkatenáció | String | 3 |
'>' vagy '!>' | Nagyobb, mint | Relációs (string) | 3 |
'<' vagy '!<' | Kisebb, mint | Relációs (string) | 3 |
'>=' vagy '!>=' | Nagyobb egyenlő, mint | Relációs (string) | 3 |
'=<' vagy '!<=' | Kisebb egyenlő, mint | Relációs (string) | 3 |
'=' vagy '!' | Egyenlőség vizsgálat | Relációs (string) | 3 |
AND | Logikai és | Logikai | 4 |
OR | Logikai vagy | Logikai | 5 |
A '!' jelet tartalmazó operátorok case-sensitive módon működnek a többi nem.
Logikai kifejezések esetén a TACL a 0-t HAMISKÉNT interpretálja, minden más egész értéket igazként. A stringek összehasonlítása láthatóan '' jelek közé kerül, így tudjuk megkülönböztetni az egészek összehasonlításától. Példaként tegyük fel, hogy STATE egy változó amiben szöveg van, COUNT pedig egy egész változó, a következő #IF kifejezés írható:
A stringek és az egészek összehasonlítása más eredményt adhat. Példaként a 10 és a 010 egészekként egyenlőek, de stringenként már nem. (= de nem '=')
Az #IF kifejezésnek aritmetikai kifejezés is megadható argumentumként.