A TACL programozási nyelv

Típusok, típuskonstrukciók

Típusok, típuskonstrukciók

Típusszerkezet

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.

Elemi típusok

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.

Típuskonstrukciók

Kidolgozásra vár.

Típuskonverziók

Kidolgozásra vár.

Változók, konstansok

TACL-ban igen érdekes módon kezelik a változókat. Egyrészt a változókat egy veremben tárolják – ami igazából vektor –, másrészt a változók önmagukban is egy-egy vermet alkotnak – amik szintén vektorok valójában. Ezzel a verem rendszerű változókezeléssel lehetőség van arra, hogy ugyanazzal a névvel hozzunk létre több változót. Az azonos nevű változók kezelése érdekében a változóknak van szintszámuk (level) és van keretszámuk (frame). A szintszám azt mutatja, hogy az aktuális változó éppen hányadik az ugyanolyan nevű változókat tartalmazó veremben. Alapértelmezés szerint mindig a verem tetején lévő változót látjuk. A keretszám azt mutatja meg, hogy hányadik egymásba ágyazott keretben lett definiálva a változó. A keret arra szolgál, hogy automatikus változó-élettartamkezelést tudjunk megvalósítani. Egy példán keresztül jobban megérthetjük hogy mit is jelent a szintszám ill. a keretszám:

#push var == létre hoztuk a var nevű változót


Ilyenkor a var level/frame száma 1/1.

#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 varItt level/frame: 1/1, var értéke: 1
#output [var]A képernyőn megjelenik var értéke: 1
#pop varItt 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.

#frameItt kezdődik a frame
#push var Level/frame: 1/1
#set var 11Var értéke: 11 (első keret/első szint)
#push var Level/frame: 2/1
#set var 12Var értéke: 12 (első keret/első szint)
#frameItt kezdődik a második frame
#push var Level/frame: 3/2
#set var 21Var értéke: 23 (második keret/első szint)
#unframeVége a második frame-nek level/frame-je: 2/1
#output [var]A képernyő var értéke jelenik meg: 12
#unframevé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 varVar deklarálása
#set var 1Var értéke: 1
#push varVar újbóli deklarálása
#set var 2Var é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.:
#push var #set var elso #append var masodik #append var harmadik
== a var tartalma a következő lesz:

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.

Kifejezések, operátorok

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ó:

[#IF STATE '=' "DONE" OR COUNT = 10 |THEN| ...

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.

[#IF A+1 = 3 |THEN| ... ]