A Tcl programozási nyelv

Utasítások, vezérlési szerkezetek


Egy parancs végrehajtása két lépésből áll. Az első lépésben az interpreter a parancsot szavakra bontja és a szavakon elvégzi a helyettesítéseket. Az első (már helyettesített) szó határozza meg a végrehajtandó parancs nevét. A második lépésben a parancsot implementáló eljárás meghívódik és megkapja a parancs szavait. Az eljárás tetszőlegesen értelmezheti a parancs argumentumait, például egész számként, változónévként vagy Tcl scriptként.

A parancs végrehajtása befejeződhet normálisan vagy kivétellel. A normálisan befejeződő parancs egy stringet ad vissza. Egy Tcl script visszatérési értéke utolsó parancsának eredménye vagy return parancsban megadott érték.

A változók Tcl-ben parancsokon és helyettesítéseken keresztül érhetők el. Kétféle változó áll rendelkezésünkre. Az egyszerű változók egyetlen string értéket tárolnak. A tömbváltozók korlátlan számú stringet tudnak tárolni, az egyes elemekre tetszőleges string indexekkel hivatkozunk. A Tcl tömböt többdimenziós tömbként is használhatjuk, hiszen vesszőkkel elválasztott számok sorozata is megengedett indexként.

A Tcl az imperatív programozási nyelvekben megszokott vezérlőszerkezeteket parancsok formájában biztosítja. A vezérlőszerkezet-parancsok argumentumai a vezérlést meghatározó kifejezések és a különböző esetekben végrehajtandó Tcl scriptek. Általában mind előbbieket, mind utóbbiakat kapcsos zárójelek közé zárva adjuk meg, hogy egyetlen argumentumnak számítsanak és több sorba is írhassuk őket:

if {$kor < 3} then {
    set hely "bölcsi"
    set etel "papi"
} elseif {$kor < 6} then {
    set hely "ovi"
    set etel "kukoricapehely"
} else {
    set hely "egyeb"
    set etel "nem válogat"
}
A zárójelezés további (és többnyire kívánatos hatása), hogy a helyettesítések csak akkor történnek meg, amikor a parancs a feltételeket kiértékeli és a scripteket végrehajtja.

Helyettesítés

A parancsok szavainak helyettesítése az alábbi egységes szabályok szerint történik, függetlenül a konkrét parancstól:

Gyenge idézőjelezés
A kettős idézőjellel ('"') kezdődő szavakat a következő kettős idézőjel zárja le. Az idézőjelek között szereplő pontosvesszők, záró szögletes zárójelek, fehér karakterek (beleértve az újsor karaktereket) a szó részévé válnak, akár a közönséges karakterek. Az idézőjelek között parancshelyettesítés, változó-helyettesítés és backslash-helyettesítés történik. A kettős idézőjelek a további feldolgozás számára nem képezik a szó részét.

Erős idézőjelezés
A nyitó kapcsos zárójellel ('{') kezdődő szavakat az ezzel párban álló záró kapcsos zárójel ('}') zárja le. A kapcsos zárójelek egymásba ágyazhatók. A backslash-sel védett kapcsos zárójeleket nem kell figyelembe venni. A kapcsoszárójelek között a backslash-újsor helyettesítés kivételével nem történik helyettesítés, és a pontosvesszők, záró szögletes zárójelek és a fehér karakterek (még az újsor is) elveszítik megkülönböztetett szerepüket. A szót pontosan a kapcsos zárójelek között szereplő karakterek alkotják, a közrefogó zárójelpár nélkül.

Parancshelyettesítés
Ha a szó tartalmaz nyitó szögletes zárójelet ('['), parancshelyettesítés megy végbe. Ehhez a Tcl interpreter végrehajtja a nyitó szögletes zárójelet követő scriptet. A script tetszőleges számú parancsot tartalmazhat és záró szögletes zárójellel (']') kell végződnie. A szögletes zárójelek egymásba ágyazhatók. A szögletes zárójelek és a köztes karakterek a script eredményével helyettesítődnek. Egy szón belül tetszőleges számú parancshelyettesítés állhat. Kapcsos zárójelek közé zárt szavakon nem történik parancshelyettesítés.

Változó-helyettesítés
A szóban szereplő dollár-jel ('$') változó-helyettesítést jelöl. A dollár jel és az azt követő karakterek helyére a változó értéke kerül. A változó-helyettesítésnek a következő formái lehetségesek:

$név Név egy egyszerű változó neve. A nevet az első olyan karakter zárja le, amely nem alfanumerikus vagy aláhúzás.
$név(index) Név egy tömbváltozó neve és index a tömb egy elemének a neve. Név csak alfanumerikus és aláhúzáskaraktereket tartalmazhat. Az index karakterein történik parancs-, változó- és backslash-helyettesítés.
${név} Név egy egyszerű változó neve. Tetszőleges karaktereket tartalmazhat a záró kapcsos zárójel kivételével.

Egy szón belül tetszőleges számú változó-helyettesítés szerepelhet. Kapcsos zárójelek közé zárt szavakon nem megy végbe változó-helyettesítés.

Backslash-helyettesítés
A szavak backslash ('\') karakterei backslash-helyettesítést írnak elő. Az alább részletezett eseteket kivéve ez a backslash törlését és az azt követő karakter közönséges karakterként való feldolgozását jelenti. Ezzel olyan különleges jelentéssel bíró karaktereket, mint a kettős idézőjel, a szögletes zárójel vagy a dollárjel, használhatunk egyszerű karakterként. Alábbi táblázat bemutatja a speciális szerepű backslash-szekvenciákat a helyükre kerülő értékekkel együtt:

\a hangos karakter (ASCII 0x07)
\b backspace karakter (ASCII 0x08)
\f lapdobás karakter (ASCII 0x0c)
\n újsor karakter (ASCII 0x0a)
\r kocsivissza karakter (ASCII 0x0d)
\t tabulátor karakter (ASCII 0x09)
\v függőleges tabulátor (ASCII 0x0b)
\újsor A backslash-t, az újsort, és az azt közvetlenül követő összes fehér karaktert egyetlen szóköz helyettesíti. Ez a szekvencia egyedi, mert helyettesítése egy külön menetben történik, még a parancs szavakra bontása előtt. Ez azt jelenti, hogy még akkor is helyettesítődik, ha kapcsos zárójelek között szerepel.
\\ backslash
\ooo Az ooo (egy-, két- vagy háromjegyű) oktális számmal megadott ASCII-kódú karakter.
\xhh A hh (teszőleges számú számjegyből álló) hexadecimális számmal megadott ASCII-kódú karakter.

A backslash-újsor kivételével nem történik backslash-helyettesítés kapcsos zárójelbe zárt szavakon.

A Tcl interpreter a parancs szavainak előállítása közben minden karaktert pontosan egyszer dolgoz fel. Például változó-helyettesítés végrehajtása után a helyettesített értéken további helyettesítés nem történik. Parancshelyettesítés esetén a szögletes zárójelek közé zárt script helyettesítések végrehajtása nélkül kerül a rekurzívan hívott interpreternek átadásra, és a script eredményén sem történnek helyettesítések.

A helyettesítések nincsenek befolyással a parancsok szavakra tagolására, mert a tagolás megelőzi a helyettesítéseket. Például hiába tartalmaz egy változó értéke szóközöket, behelyettesítve egy szóba a szó nem törik ketté.

Értékadások

Változók létrehozása

A változókat (az eljárások formális paramétereitől eltekintve) nem kell (és nem is lehet) deklarálni. Egy változó akkor jön létre, amikor először hajtunk rá végre értékadást. A tömbváltozó esetében ez az első elemre vonatkozó értékadást jelenti. A tömb pontosan azokkal az elemekkel rendelkezik, amelyekre már történt értékadás.

Az adott néven elérhető változó fajtáját az első értékadás dönti el. Ha abban a változót tömbként használtuk, tömbváltozó, különben egyszerű változó jön létre. Ahhoz, hogy a változó fajtáját megváltoztassuk, először törölnünk kell a változót.

set változónév ?érték?
A set parancs valósítja meg az értékadást. Ha változónév tartalmaz nyitó zárójelet, és záró zárójelre végződik, akkor egy tömb elemére hivatkozik, különben egy egyszerű változóra. A set létrehozza a megnevezett változót, ha még nem létezik, majd értékül adja neki a megadott értéket. Visszatérési értéke azonos a változó új értékével.

Ha a set parancsot egyetlen argumentummal hívjuk meg, nem hajt végre értékadást, csak visszaadja a változó értékét. Általában ezt változóhelyettesítéssel is megoldhatjuk. De ha változóhelyettesítést alkalmazunk, a változónévnek konstansként kell a programszövegben szerepelnie. A set parancsban megadott változónév viszont származhat parancs- vagy változó-helyettesítésből, ezzel tudunk például mutatókat szimulálni. Ha nem létező változó értékét kérdezzük le, akkor a set parancs, vagy a változóhelyettesítést tartalmazó parancs hibával tér vissza.

Megjegyzendő, hogy a Tcl-ben nemcsak globális változók vannak, hanem eljárásokhoz kapcsolódó lokális változók is. Arról, hogy a változóhivatkozások melyik környezetben milyen változókra vonatkoznak, lásd az eljárásokat ismertető részt.

Változók törlése

A változó egészen addig megmarad, amíg explicit utasítással nem töröljük (kivéve a lokális változókat, melyek az eljárásból való kilépéskor automatikusan törlődnek). A törlést az unset parancs végzi.

unset változónév ?változónév ...?
Az unset parancsnak egyszerre több törlendő változó nevét is megadhatjuk. A tömbökből egyenként törölhetünk elemeket indexelt változónév megadásával, de egy tömböt egyben is törölhetünk, ha indexek nélkül tüntetjük fel a tömb nevét. Az unset parancs üres stringet ad vissza.

Ha nem létező változó törlését kíséreljük meg, az unset parancs hibával tér vissza, és az argumentumlistában a nem létezőt követő változókat nem törli.

Módosító értékadások

Gyakran fordul elő, hogy egy programlépés valamely változó értékének megváltoztatására terjed ki, például egy számláló növelésére, vagy egy string megtoldására. Egy ilyen lépés végrehajtható a változó kiolvasásával, a megfelelő művelet elvégzésével és egy értékadással. Ha erre külön eszközt biztosít a nyelv, akkor hatékonyabb, olvashatóbb és tömörebb programot írhatunk.

incr változónév ?növekmény?
Az incr utasítás a megadott változó értékét megnöveli a növekménnyel, alapértelmezésben eggyel. A változó értékének és a növekménynek is előjeles egész számnak kell lennie. A visszatérési érték a változó új tartalma lesz.

append változónév ?érték ...?
Az append parancs a megadott értékeket rendre a változóhoz fűzi. Ha a változó még nem létezik, létrejön, és értéke az érték argumentumok konkatenáltja (érték argumentumok híján az üres string) lesz. Ez a parancs hatékonyan oldja meg hosszú stringek fokozatos felépítését.

Namespace-ek

tcl8.0   A Tcl 8.0-ban bevezették a namespace-eket, melyek faszerűen egymásba ágyazhatóak.
  • A gyökér namespace jele a ::
  • Szintén :: használandó az alnamespacek elválasztására is hivatkozáskor.
  • A namespace parent a szülő, a namespace child a gyermek namespace-eket adja vissza.
  • Egy programszöveget a namespace eval-lal hajtathatunk végre egy adott namespace-en belül.
  • Namespace változókat a variable paranccsal hozhatunk létre.
  • namespace export-tal parancsokat exportálhatunk, amit más namespace-ek namespace import-tal importálhatnak és így rövid néven elérhetik.
  • Ez e mechanizmus nem szűkíti az elérhetőséget, bármely változót, parancsot használhatunk a namespace-én kívül hosszú nevével, ha azt ismerjük. Pl.:

    ::MyPackage::DoSomething  $::MyPackage::Consts::Pi
    namespace import MyPackage::*  # mindent amit MyPackage exportál, importálunk

Elágazás

if feltétel1 ?then? törzs1
    ?elseif feltétel2 ?then? törzs2 ...?
    ??else? törzsN?
Az if parancs feltétel argumentumai logikai értéket eredményül adó kifejezések (a logikai érték egy szám, ahol a 0 felel meg a hamisnak, de lehet true, yes, false vagy no is), a törzsek Tcl scriptek. A parancs sorra értékeli ki a feltételeket, és az első teljesülő feltételhez tartozó törzset hajtja végre. Ha egyik feltétel sem teljesül, és van else-ág, végrehajtja annak törzsét. Az if parancs visszatérési értéke az üres string lesz, ha egyik feltétel sem teljesült és nincsen else-ág, egyébként a végrehajtott törzs visszatérési értéke (azaz a törzs utolsó utasításának visszatérési értéke) lesz a visszatérési érték.

A then és else argumentumokat nem kötelező megadni, de növelik az olvashatóságot. Tetszőleges számú elseif-ágat adhatunk meg, beleértve, hogy egyet sem.

switch ?kapcsolók? string minta törzs ?minta törzs ...?
switch ?kapcsolók? {string minta törzs ?minta törzs ...?}
A switch parancs string és minta argumentumai stringek, törzs argumentumai Tcl scriptek. A parancs stringet rendre a mintákra illeszti, és az első illeszkedő mintához tartozó törzset hajtja végre. A végrehajtott törzs visszatérési értékét adja vissza. Ha az utolsó minta default, akkor az minden stringre illeszkedik. Ha string nem illeszkedik egyik mintára sem, a switch parancs üres stringgel tér vissza.

A parancsnevet közvetlenül követő, kötőjellel ('-') kezdődő argumentumok a switch parancs működését szabályozó kapcsolók. A következőket használhatjuk:

-exact
A stringnek azonosnak kell lennie a mintával. Ez az alapértelmezés.
-glob
A minta a string match parancsban megengedett minta, és az illesztés ennek értelmében történik.
-regexp
A minta egy reguláris kifejezés, és az illesztés a regexp parancsnak megfelelő.
--
A kapcsolók sorának végét jelzi. A következő argumentum már nem számít kapcsolónak, még ha kötőjellel kezdődik is.
A switch parancs használatakor választhatunk, hogy a mintákat és a törzseket külön-külön argumentumként, vagy egyetlen argumentumként, egy listában adjuk meg. Előbbit akkor célszerű alkalmazni, ha helyettesítésekre van szükség a minták vagy törzsek némelyikén. Utóbbinak előnye, hogy egyszerűen több sorba írható.

Ciklus

while feltétel törzs
A wile parancs feltétel argumentuma logikai értéket adó kifejezés, törzs Tcl script. A parancs addig ismétli feltétel kiértékelését és törzs végrehajtását, amíg feltétel hamis értéket nem ad. Ekkor a ciklus végrehajtása befejeződik (törzs már nem hajtódik végre). A while parancs üres stringet ad vissza.

for inicializáció feltétel léptetés törzs
A for parancs feltétel argumentuma logikai értéket adó kifejezés, a többi Tcl script. A parancs kezdetben végrehajtja az inicializációt. Ezt követően addig ismétli rendre feltétel kiértékelését, törzs végrehajtását és léptetés végrehajtását, amíg feltétel hamis értéket nem ad. Ekkor a parancs végrehajtása befejeződik (törzs már nem hajtódik végre). A visszatérési érték üres string.

foreach változónév lista törzs
A foreach parancs argumentumai rendre egy változó neve, egy lista és egy Tcl script. A parancs a lista elemeit sorrend szerint értékül adja a megadott változónak és végrehajtja törzset. A visszatérési érték üres string.

break
A break parancs ciklusok törzsén belül adható ki. Hatására a ciklus végrehajtása azonnal befejeződik.

A break parancs valójában TCL_BREAK kivétellel tér vissza, amelyet normális esetben a ciklust megvalósító parancs kezel le. A kivételt azonban elfoghatja más is, például egy catch parancs vagy egy eljárás törzsének vége.

continue
A continue parancs szintén ciklusok törzsén belül adható ki. A ciklusmag hátralevő részét átugorja (a végrehajtás while ciklusoknál a feltétel kiértékelésével, for ciklusoknál a léptetés végrehajtásával, foreach ciklusoknál a következő listaelemre állással folytatódik).

A continue parancs működése is kivételeken alapul, TCL_CONTINUE kivételt vált ki.

Stringben vagy fájlban adott scriptek végrehajtása

eval arg ?arg ...?
Az eval parancs argumentumait a concat parancsnak megfelelően konkatenálja, mint Tcl scriptet végrehajtja, és az eredményt (vagy kivételt) visszaadja.

uplevel ?szint? arg ?arg ...?
A megadott szinten hajtja végre a parancsot, amit az argumentumok konkatenációjából kap, és visszaadja az eredményt vagy a kivételt. Olyan, mintha az adott szinten eval arg-ot hajtottunk volna végre. Az alapértelmezett szint 1 (az eljárást hívó szintje). A szintek jelentését és leírását lásd az upvar parancsnál.
tcl8.0  
namespace eval namespace_neve arg ?arg ...?
A megadott namespace-ben értékeli ki. Hasonló az eval-hoz.
source fájlnév
A source parancs a megadott fájl tartalmát, mint Tcl scriptet végrehajtja, és az eredményt (vagy kivételt) visszaadja. A hullámmal ('~') kezdődő fájlneveket ugyanúgy kezeli, mint az open parancs.

Változók figyelése

A Tcl lehetőséget biztosít arra, hogy figyeltessük, ha egy változót olvasnak, írnak és/vagy törölnek. A figyelő eljárás, amelyet a programozó ad meg, mindannyiszor meghívódik, ahányszor a kiválasztott hozzáférést a változóra végrehajtják. A figyeléssel kapcsolatos utasításokat a trace parancs valósítja meg.

trace művelet ?arg ...?
Ezen belül a figyelő eljárást a trace variable paranccsal rendeljük hozzá a változóhoz.
trace variable változónév művelet parancs
A változó lehet egyszerű változó, tömbváltozó vagy tömbelem. Ha tömböt adunk meg, a tömb összes elemére fog kiterjedni a figyelés.

A figyelendő hozzáférések halmazát a művelet stringgel adjuk meg. A string egyes karakterei egy-egy műveletet jelölnek:

r olvasás figyelése
w írás figyelése
u törlés figyelése

A trace variable parancs üres stringet ad vissza.

A figyelt hozzáférés végrehajtása után parancs három argumentummal kiegészítve hívódik meg (tipikus esetben a parancs egy háromargumentumú eljárás neve):

   parancs változónév index művelet
Ha a hozzáférésben érintett változó egyszerű változó vagy tömbváltozó, változónév a változó neve, index üres string; ha tömbelem, változónév a tömb neve, index a tömbindex. A két név azt a változónevet adja meg, amelyen keresztül a változóra a hivatkozás megtörtént, ami nem feltétlenül egyezik meg a trace parancsban megadott változónévvel. A művelet argumentum a végrehajtott hozzáférés fajtája szerint "r", "w" vagy "u".

A figyelő parancs végrehajtása ugyanazon az eljáráshívási szinten történik, mint a figyelt hozzáférés. Ezért a parancs hozzáférhet az aktuális lokális változókhoz (persze ha a parancs eljárást hív meg, az eljárás a saját lokális változóit fogja látni, ha nem ad ki upvar parancsot).

Olvasás vagy írás miatt meghívott figyelő parancs végrehajtása alatt ideiglenesen szünetel az olvasások és írások figyelése. A figyelő parancs olvasás esetén a változó kiolvasása előtt, írás esetén a változó értékének megváltoztatása után kerül végrehajtásra. Ezért ha a figyelő parancs értéket ad a figyelt változónak, azzal meghatározza az olvasott vagy írt értéket. A figyelő parancsban keletkező kivételek az olvasást vagy írást kezdeményező parancsnak adódnak tovább.

A törlés figyelése egyaránt kiterjed az unset paranccsal kiváltott törlésekre és a lokális változók automatikus törlésére eljárásból való visszatéréskor. A figyelő parancs a változó törlése illetve az eljárás elhagyása után hívódik meg. Végrehajtása alatt a változók figyelése változatlanul érvényben marad. A figyelő parancsban fellépő kivételek elnyelődnek.

Egy változó figyelése csak akkor szűnik meg, ha megszüntetjük a trace vdelete paranccsal, vagy ha a változót törlik. Egy tömb elemének törlése nem érinti a tömb egészére vonatkozó figyeléseket.

Egy változót egyszerre több paranccsal is figyeltethetünk, a parancsok abban a sorrendben hívódnak meg, amilyen sorrendben a változóhoz rendeltük őket. Az egész tömbre vonatkozó figyelő parancsok végrehajtása megelőzi a konkrét tömbelemre vonatkozókét.

trace vdelete változónév művelet parancs
Megszünteti a megadott változóra vonatkozó azon figyelést, amelyet azonos argumentumokkal meghívott trace variable paranccsal rendeltünk el. Ha ilyen figyelés nincsen, nem történik semmi. Üres stringet ad vissza.

trace vinfo name
Visszaadja a megadott változóra vonatkozó figyelések listáját. Minden figyelést egy kételemű lista ír le, ahol az első elem a figyelt műveleteket adja meg, a második elem pedig a figyelő parancsot.

Információk lekérdezése a Tcl interpreterről

info tárgy ?arg ...?
Az info parancs információkat szolgáltat a végrehajtó Tcl interpreterről, például annak változóiról vagy eljárásairól.

Információk változókról

info exists változónév
Egyet ad vissza, ha a megnevezett változó létezik a pillanatnyi végrehajtási szinten, külÖnben nullát.

info vars ?minta?
A pillanatnyi végrehajtási szinten látható változók listáját adja vissza. Ha megadunk egy mintát, akkor a lista csak azokra a változónevekre terjed ki, amelyek a string match parancs értelmében illeszkednek a mintára.

info globals ?minta?
A létező globális változók neveinek listáját adja vissza. Ha megadunk egy mintát, akkor a lista csak azokra a változónevekre terjed ki, amelyek a string match parancs értelmében illeszkednek a mintára.

info locals ?minta?
A pillanatnyi végrehajtási szinten létező valódi lokális változók neveinek listáját adja vissza (a global vagy upvar paranccsal definiált változók nem valódi lokális változók). Ha megadunk egy mintát, akkor a lista csak azokra a változónevekre terjed ki, amelyek a string match parancs értelmében illeszkednek a mintára.

Információk eljárásokról

info procs ?minta?
A proc paranccsal definiált eljárások neveinek listáját adja vissza. Ha megadunk egy mintát, akkor a lista csak azokra az eljárásnevekre terejed ki, amelyek a string match parancs értelmében illeszkednek a mintára.

info args eljárásnév
A megnevezett Tcl eljárás formális paraméterneveinek listáját adja vissza. Létező Tcl eljárás nevét kell megadnunk.

info default eljárásnév paraméternév változónév
Ha a megnevezett Tcl eljárás megadott formális paraméterének nincsen alapértelmezett értéke, nullát ad vissza. Különben egyet ad vissza és az alapértelmezett értéket értékül adja a változónév nevű változónak. Létező Tcl eljárást és annak létező formális paraméterét kell megadnunk.

info body eljárásnév
A megnevezett Tcl eljárás törzsét adja vissza. Létező Tcl eljárás nevét kell megadnunk.

Parancsokkal kapcsolatos információk

info commands ?minta?
A létező Tcl parancsok neveinek listáját adja vissza, beleértve a predefinit parancsok és a proc paranccsal definiált eljárások neveit. Ha megadunk egy mintát, akkor a lista csak azokra a parancsnevekre terejed ki, amelyek a string match parancs értelmében illeszkednek a mintára.

info complete parancs
Egyet ad vissza, ha parancs nem tartalmaz nyitott zárójeleket vagy idézőjeleket, különben nullát. Segítségével soronként Tcl parancsokat olvasó programok eldönthetik, hogy az egyik sorban megkezdett Tcl parancs folytatódik-e a következő sorban.

info cmdcount
Az interpreter által eddig végrehajtott parancsok számát adja vissza.

Egyéb információk

info script
A legbelső, a Tcl interpreter által végrehajtott fájl nevét adja vissza. Ha a Tcl interpreter nincsen fájl végrehajtása közben, a visszatérési érték üres string.

info level ?szint?
Ha argumentum nélkül hívjuk meg, a pillanatnyi végrehajtási szintet adja vissza (a globális szint 0, a globális szintről hívott eljárás szintje 1, sít.). Különben a visszatérési érték a megadott szinten végrehajtott eljárás nevét és argumentumait tartalmazó lista. Pozitív számokkal abszolút végrehajtási szintekre hivatkozhatunk, nullával a pillanatnyi végrehajtási szintre, negatív számokkal pedig relatív végrehajtási szintekre (a hívó eljárás végrehajtási szintje -1, az őt hívóé -2, sít.).

info library
A standard Tcl scripteket tartalmazó könyvtár nevét adja vissza.

info tclversion
A futó Tcl verziószámát adja vissza x.y alakban. Az azonos egészrészű Tcl verziók növekvő törtrész szerint egymással felülről kompatibilisek.

info patchlevel
A futó Tcl kiadásszámát adja vissza. A kiadásszám a verziószámnál részletesebb adat, amely minden alfa, béta vagy kész kiadást egyértelműen azonosít.

Történeti lista

Amikor olyan alkalmazással dolgozunk, amelynek vezérlése részben vagy egészben parancsokkal történik, gyakran fordul elő, hogy korábban kiadott parancsokat szertnént megismételni, esetleg kisebb változtatással. Az alkalmazást akkor érezzük igazán kényelmesnek, ha nyújt olyan lehetőségeket, amelyek révén elkerülhetjük a parancs sokadszori begépelését. A Tcl-ben írt és Tcl parancsokat fogadó programokat a history parancs ruházza fel a kívánt lehetőséggel.

history ?művelet? ?arg ...?
A history parancs lehetővé teszi, hogy egy történeti listában tartsuk nyilván az utoljára kiadott egynéhány parancsot, és hogy ezekre hivatkozhassunk. A hivatkozás három formában történhet:

Közönséges történeti parancsok

Ebbe a kategóriába azok a parancsok tartoznak, amelyeknek nincsen közvetlen szerepe a történeti listában rögzített parancsok ismételt kiadásában.

history keep méret
Ezzel a paranccsal adhatjuk meg, hogy a történeti lista hány parancsot őrizzen meg. Alapértelmezésben a történeti lista 20 parancsot tud tárolni. A parancs üres stringet ad vissza.

history add parancs ?exec?
A megadott parancsot felveszi a történeti lista végére. Ha az utolsó argumentum exec vagy ennek prefixe, parancs végrehajtódik, és visszatérési értéke lesz a history add parancs visszatérési értéke is. Különben üres stringet kapunk vissza.

history change új ?hivatkozás?
A hivatkozott (alapértelmezésben az utolsó) parancsot lecseréli az új parancsra.

history nextid
Azt a sorszámot adja vissza, amelyet a következőként a történeti listába kerülő parancs fog kapni. Ezt a számot a parancsokat fogadó alkalmazás például kiírhatja a parancs bekérése előtt.

history ?info? ?szám?
Visszaad egy stringet, amely ember által olvasható formában tartalmazza a történeti listát (soronként egy-egy parancs sorszámát és magát a parancsot). A szám argumentummal a listát az utolsó egynéhány parancsra korlátozhatjuk.

Ismétlő történeti parancsok

Ebbe a kategóriába azok a parancsok tartoznak, amelyekkel a felhasználó a történeti listában rögzített parancsokat újra fel tudja használni. Ha a történeti listába az újrafelhasznált parancs nem szövegszerűen kerülne be, hanem history hívást tartalmazva, akkor a további újrafelhasználást megnehezítené, hogy a history hívások (például a relatív sorszámok miatt) mást és mást eredményeznének az eredeti végrehajtáskor és az egyes ismétlések alkalmával. Ezért az ismétlő parancsok a történeti lista legújabb bejegyzését, ha az tartalmaz history hívást, helyettesítik az eredően végrehajtott paranccsal. Így a történeti listát szolgáltató alkalmazásnak elég a felhasználó által beírt parancsot a végrehajtás előtt a történeti listába felvennie, hogy a történeti listába a megfelelő dolgok kerüljenek.

history redo ?hivatkozás?
Végrehajtja a hivatkozott (alapértelmezésben az utolsó) parancsot és visszaadja annak eredményét.

history substitute régi új ?hivatkozás?
A hivatkozott (alapértelmezésben az utolsó) parancsban régi minden előfordulását újra helyettesíti, végrehajtja az így adódó parancsot, és visszaadja az eredményt.

history event ?hivatkozás?
Visszaadja a hivatkozott (alapértelmezésben az utolsó) parancsot.

history words szelektor ?hivatkozás?
Visszaadja a hivatkozott (alapértelmezésben az utolsó) parancs szelektor által meghatározott szavait, egymástól szóközzel elválasztva. Szelektornak három formája megengedett: Az első két formában a parancs utolsó szavára hivatkozhatunk a '$' karakterrel.

Egyéb parancsok

rename régi új
A rename parancs a régi nevű parancsot átnevezi új nevűre. Ha új üres string, a régi parancs törlődik. A rename üres stringet ad vissza.

time script ?szám?
A time szám-szor (alapértelmezésben egyszer) végrehajtja a megadott scriptet, és visszaad egy
  n microseconds per iteration
alakú stringet, amely a script végrehajtásához szükséges átlagos valós időt jellemzi.

Ismeretlen parancsok

unknown parancsnév ?arg ...?
Amikor a Tcl interpreter nem létező parancs hívásával kerül szembe, megvizsgálja, hogy létezik-e unknown nevű parancs. Ha nem létezik, akkor hibaüzenetet ad vissza. Viszont ha létezik, a Tcl interpreter meghívja, és arugmentumként átadja neki a nem létező parancs nevét és a hívás argumentumait (az átadott argumentumokon már megtörténtek a helyettesítések). Lásd a standard Tcl könyvtárban definiált unknown parancsot.