Kifejezések
A Tcl nem elsődleges szinten vezeti be a kifejezés fogalmát, hanem a kifejezésekkel paraméterezhető parancsoknál.
expr arg ?arg ...?
A kifejezésekhez legszorosabban kötődő parancs az expr, amelynek egyetlen funkciója, hogy argumentumai konkatenáltját, mint Tcl kifejezést, kiértékelje, és az eredményt visszaadja. Az expr parancs természetes helye a parancshelyettesítésekben van, például:
   set x [expr 2*$y + $z]
Az expr-en túli kifejezésekkel paraméterezhető parancsok is - mint például a vezérlőszerkezet-parancsok, amelyeknek a vezérlési feltételt kifejezéssel adjuk meg - mind az expr-rel azonos módon kezelik a kifejezésket. Ezért foglalkozzunk először a konkrét parancsoktól függetlenül a Tcl kifejezésekkel.

A Tcl kifejezések nagyon hasonlítanak a C programozási nyelv kifejezéseire. A Tcl operátorai a C operátorainak részhalmazát alkotják, precedenciájuk és jelentésük megegyezik a megfelelő C operátorokéval. Akár a C-ben, a Tcl-ben sem számítanak az operandusok, operátorok és zárójelek közötti szóközök. A C-ből átvett lehetőségeken kívül a Tcl kifejezésekben mód nyílik még helyettesítések alkalmazására, valamint stringek összehasonlítására relációs operátorokkal.

Operandusok

A Tcl és C kifejezések közötti egyik különbség az operandusok megadásának módjában van. A Tcl kifejezések operandusaiban például megengedettek az alábbi helyettesítések:
  • Megadhatunk változókat a '$' jelöléssel. Az operandus a változó értéke lesz.
  • A kettős idézőjelekbe zárt stringeken a kifejezés elemzése során backslash-, változó- és parancshelyettesítés megy végbe.
  • A kapcsos zárójelek közé írt string minden helyettesítés nélkül lesz az operandus.
  • A szögletes zárójelek közé helyezett Tcl script végrehajtódik, és az eredmény lesz az operandus.
Meg kell jegyezni, hogy ezeket a helyettesítéseket a kifejezést kiértékelő parancs hajtja végre, függetlenül a parancs végrehajtását megelőző helyettesítési fázistól. Ezért célszerű a kifejezéseket kapcsos zárójelbe zárni, hogy csak egy menetben történjen helyettesítés.

A helyettesítés után Tcl egész számként próbálja meg értelmezni az operandusokat, ha azok számjeggyel kezdődnek. Egész számokat megadhatunk decimálisan (ha az operandus első karaktere '1'-'9'), oktálisan (ha az operandus első karaktere '0') vagy hexadecimálisan (ha az operandus első két karaktere '0x').

Ha az operandus számjeggyel kezdődik, de nem felel meg az egész számok szintaxisának, a Tcl lebegőpontos számként próbálja elfogadni. Ugyanazokat a megadási módokat használhatjuk, mint amelyeket az ANSI C szabvány meghatároz (kivéve az 'f', 'l' vagy hasonló szuffixeket, amelyeket a legtöbb Tcl interpreter nem támogat).

Szintaktikus hibának számít, ha az operandus számjeggyel kezdődik, de nem egész vagy lebegőpontos szám. A nem számjeggyel kezdődő operandusokat a Tcl stringként kezeli, de csak akkor, ha a string a kifejezésekben támogatott helyettesítések valamelyikéből származik.

Lehetőségünk van továbbá matematikai függvények alkalmazására is, amelyek argumentumai tetszőleges Tcl kifejezések lehetnek, például 'fmod($x,$y)'.

Operátorok és precedencia

Következzenek a Tcl operátorai csökkenő precedencia szerint.
-  +  ~  !
Negatív és pozitív előjeloperátor, bitenkénti negáció, logikai tagadás. Ezek az operátorok nem alkalmazhatók stringekre, és a bitenkénti negáció csak egészekre alkalmazható.
*  /  %
Szorzás, osztás, maradék. Ezek az operátorok nem alkalmazhatók stringekre, és a maradékoperátor csak egészekre alkalmazható. A maradék előjele azonos az osztóéval és abszolút értéke kisebb az osztóénál.
+  -
Összeadás és kivonás. Csak numerikus operandusokra alkalmazható.
<>>
Balra és jobbra léptetés. Csak egész operandusokra alkalmazható.
<>  <=>=
Kisebb, nagyobb, kisebb vagy egyenlő és nagyobb vagy egyenlő relációs operátorok. Az operátorok 1-et adnak eredményül, ha a reláció fennáll, 0-át különben. Ezek az operátorok számokra és stringekre egyaránt alkalmazhatók.
==  !=
Egyenlő és nem egyenlő. Mindkét operátor eredménye 0 vagy 1. Tetszőleges típusú operandusra alkalmazhatók.
&
Bitenkénti ÉS. Csak egészekre alkalmazható.
^
Bitenkénti KIZÁRÓ VAGY. Csak egészekre alkalmazható.
|
Bitenkénti VAGY. Csak egészekre alkalmazható.
&&
Logikai ÉS. Eredménye 1, ha egyik operandusa sem nulla, különben 0. Csak numerikus operandusokra alkalmazható.
||
Logikai VAGY. Eredménye 0, ha mindkét operandusa nulla, különben 1. Csak numerikus operandusokra alkalmazható.
x ? y : z
Ha x kiértékelve nem nullát ad, az eredmény az y eredménye, különben a z eredménye. Az x operandusnak numerikusnak kell lennie.

A bináris operátorok azonos precedencián belül balról jobbra kötnek.

Az &&, || és ?: operátorok lusta kiértékelésűek, mint C-ben, vagyis nem értékelődik ki az összes operandus, ha a kifejezés értéke már az operandusok egy részének kiértékelése után meghatározható. Ez nem feltétlenül teljesül, ha a kifejezést nem zártuk kapcsos zárójelek közé, mert a parancs meghívása előtt már történhetnek helyettesítések a kifejezés tetszőleges részeiben.

Matematikai függvények

A Tcl kifejezésekben a következő, a C könyvtárban is szereplő matematikai függvényeket használjatjuk:
   acos    atan2   cosh    fmod    log10   sinh    tanh    asin    ceil    exp     hypot   pow     sqrt       atan    cos     floor   log     sin     tan
Ezek a függvények az azonos nevű C könyvtári függvény meghívásával számítják ki az eredményt. A Tcl a további függvényeket definiálja még:
abs(x) Az x abszolút értékét adja vissza. Az x lehet egész vagy lebegőpontos, az eredmény típusa ennek megfelelő.
double(x) Ha x lebegőpontos érték, egyszerűen visszaadja, különben lebegőpontosra konvertálja és úgy adja vissza.
int(x) Ha x egész, egyszerűen visszaadja, különben csonkítással egészre konvertálja és úgy adja vissza.
round(x) Ha x egész érték, egyszerűen visszaadja, különben kerekítéssel egészre konvertálja és úgy adja vissza.
tcl8.0   A 8.0-s verzióban használhatóak a rand() és srand(x) véletlenszám-generáló függvények, amelyek megegyeznek az azonos nevű C könyvtári függvényekkel.

A kiértékelés részletei

A Tcl a kifejezés kiértékelés közben C típusokat használ, az egészeket long, a lebegőpontos számokat double értékekkel reprezentálja. A stringgel adott operandusok int-re vagy double-ra történő konverziója során fellépő túl- és alulcsordulások észlelése a Tcl fordításához használt C könyvtáron múlik, ezért ahol ez lényeges, ne erre alapozzunk. A közbülső eredmények esetében is C-beli viszonyok uralkodnak, vagyis az egészek túl- és alulcsordulásáról általában nem kapunk információt, a lebegőpontos számok esetében a hardver adta lehetőségek többnyire jobbak, ezekben bízhatunk.

A kiértékelés közben a Tcl egészeket használ, amíg lehetséges, és csak lebegőpontos operandus előfordulása esetén tér át lebegőpontos számokra.

A kiértékelés végeztével az eredmény string alakba konvertálódik. Ha az eredmény lebegőpontos típusú, akkor a string tartalmazni fog egy tizedespontot ('.') és egy 'e' betűt, hogy ez kifejezésre jusson. Alapértelmezésben hat szignifikáns jegy szerepel a lebegőpontos eredmény stringre konvertált alakjában. Ha a tcl_precision nevű globális változó létezik, akkor az adja meg a szignifikáns jegyek számát.

Bár a Tcl lehetővé teszi stringek összehasonlítását kifejezésekben, jobban járunk, ha a string compare parancsot használjuk. Ugyanis abban az esetben, ha az egyik operandus számként értelmezhető, az összehasonlítás előtt azt a Tcl előbb számmá konvertálja, majd vissza stringgé. Így például az 'expr {"0x11" <"0z11"} ' parancs eredménye 0, mert az összehasonlítás valójában '17' és '0z11' között zajlik.

Stringek

A string a Tcl egyetlen valódi adattípusa. A parancsok argumentumai és visszatérési értékei is stringek. A további adattípusokat (listák, számok) is stringekkel reprezentálja.

tcl8.0   8.0-tól kezdve már a Tcl_Obj struktúrákon alapul az adatok tárolása, így a stringeké és a listáké is. Ez hatékony tárolást tesz lehetővé, és elkerülhetők a felesleges konverziók.
Egyszerű stringműveletek
A stringműveletek nagy részét a string parancs valósítja meg.
string művelet arg ?arg ..?
Az első argumentummal választjuk ki a műveletet, a további argumentumok szintaxisát az egyes műveletek külön-külön határozzák meg. A műveletekben közös, hogy a string karaktereit nullától kezdve indexelik.
string index string index
A megadott string indexedik karakterét adja vissza. Ha nullánál kisebb vagy a string hosszánál nem kisebb indexet adunk meg, az eredmény üres string.
string range string kezdet vég
A megadott string kezdet és vég indexek közé eső részét adja vissza. Második indexként megadhatunk end-et is, ami a string utolsó karakterének indexét jelenti. Ha kezdet kisebb nullánál, nullának, ha vég nem kisebb a string hosszánál, end-nek számít. Ha kezdet nagyobb végnél, üres string az eredmény.
string length string
A megadott string hosszát adja vissza.
string wordstart string index
Az index indexen álló karaktert tartalmazó szó első karakterének indexét adja vissza. Egy szónak a string összefüggő, alfanumerikus és aláhuzáskarakterekből álló, és az egyetlen egyéb karakterből álló részstringjei számítanak.
string wordend string index
Az index indexen álló karaktert tartalmazó szó utolsó karaktere mögötti karakter indexét adja vissza.
string trim string ?törlendő?
A megadott string elejéről és végéről a törlendő karakterek eltávolításával előálló stringet adja vissza. Törlendő alapértelmezése a szóköz, a tabulátor, az újsor és a kocsivissza karakter.
string trimleft string ?törlendő?
Mint a string trim parancs, de csak a string elejéről töröl.
string trimright string ?törlendő?
Mint a string trim parancs, de csak a string végéről töröl.
string tolower string
A nagybetűket kisbetűkre cserélve adja vissza a megadott stringet.
string toupper string
A kisbetűket nagybetűkre cserélve adja vissza a megadott stringet.
string compare string1 string2
A karakterek ASCII kódja szerinti lexikális összehasonlítást végez két stringen. A -1, 0 vagy 1 értéket adja vissza aszerint, hogy az első string kisebb, egyenlő vagy nagyobb a másodiknál.
string first minta string
Minta első előfordulását keresi meg stringben. Ha ez létezik, az előfordulás első karakterének indexét, ha nem, -1-et ad vissza.
string last minta string
Minta utolsó előfordulását keresi meg stringben. Ha ez létezik, az előfordulás első karakterének indexét, ha nem, -1-et ad vissza.
string match minta string
Egyet vagy nullát ad vissza aszerint, hogy string illeszkedik-e mintára vagy sem. A minta karakterei a velük azonos karakterekre illeszkednek, a következők kivételével:
* Tetszőleges - akár üres - részstringre illeszkedik.
? Tetszőleges karakterre illeszkedik.
[karakterek] A szögletes zárojelek között megadott karakterekre illeszkedik. Ha karakterekben két karakter között kötőjel áll, az ASCII kód értelmében a két karakter közé eső karakterekre is illeszkedik.
\x Az x karakterre illeszkedik. Így semlegesíthetjük a *?[]\ karakterek speciális jelentését.
Formázott stringek
A Tcl rendelkezésünkre bocsát egy stringformázó parancsot, amelyet a C programozási nyelv könyvtárából ismert sprintf függvényhez hasonlóan használhatunk:
format séma ?arg ...?
Az első argumentum, a séma adja meg az eredményként visszaadott formázott string vázát, és hogy a további argumentumokat hol és milyen alakban kell a vázban elhelyezni. A séma közönséges karakterei változtatás nélkül az eredmény részévé válnak, a '%' karakterrel kezdődő konverziós specifikációk helyére pedig az argumentumok íródnak, megfelelő alakra konvertálva.

A sémát követő argumentumok a séma konverziós specifikációinak sorrend szerint felelnek meg. Legtöbb specifikációhoz egy argumentum tartozik, de vannak kivételek.

A konverziós specifikáció a '%' karakter mögött az alábbi táblázatban ismertetett elemeket tartalmazhatja, a megadott sorrendben:

Argumentum-pozíció
Egy természetes szám és egy '$' karakter alkotja. Azt adja meg, hogy a specifikációhoz tartozó első argumentum hányadik argumentum-pozíción áll (a továbbiaknak, ha vannak, ezt kell követniük). A sémát követő első argumentum pozícója az 1-es. Két lehetőségünk van: vagy egyáltalán nem használunk explicit argumentum-pozíciókat, és ekkor sorrend szerinti megfeleltetés történik, vagy pedig minden specifikációban megadjuk a pozíciót.
Jelzők halmaza
A következő karakterekből állhat (sorrendjük egymás között tetszőleges):
# Alternatív konverzió. 'o' konverziónál: az eredményben az oktális szám mindenképpen nullával fog kezdődni. 'x' illetve 'X' konverzió: az eredményben a hexadecimális szám "0x"-szel illetve "0X"-szel fog kezdődni. 'e', 'E', 'f', 'g' és 'G' konverzió: az eredményben a lebegőpontos szám mindenképpen tartalmazni fog tizedespontot. 'g' és 'G' konverziónál előzőeken kívül: az eredmény tartalmazni fogja a "felesleges" nullákat is.
0 A konvertált érték balról nullákkal töltődik fel a megadott szélességre.
- A konvertált értéket a megadott szélességen belül baloldalra igazítja. Hatástalanítja a '0' jelzőt.
szóköz Előjeles konverzióban ('d', 'e', 'E', 'f', 'g', 'G' és 'i'): pozitív számok előtt egy szóközt hagy szabadon az előjel helyén.
+ Előjeles konverzióban: Minden (akár nemnegatív) szám elé ír előjelet. Hatástalanítja a szóköz jelzőt.
Szélesség
Természetes szám. Azt adja meg, hogy a konvertált érték legalább hány karaktert foglaljon el. Ha a konvertált érték ennél rövidebb, akkor töltelékkarakterekkel egészül ki (alapértelmezésben balról szóközökkel, de a '-' és '0' jelzőkkel ezt felülbírálhatjuk).
Pontosság
Nemnegatív egész szám. Jelentése a konverziótól függ:
d, i, o, u, x, X Az eredmény számjegyeinek minimális számát adja meg (szükség esetén a szám balról nullákkal egészül ki).
e, E, f A tizedespont mögé írt számjegyek számát adja meg.
g, G A szignifikáns számjegyek maximális számát adja meg.
s Az eredményben megjelenő karakterek maximális számát adja meg (az argumentum szükség esetén jobbról csonkolódik).
Típusjelző
Alábbiak közül választhatunk:
h Hatására a 'd', 'i', 'o', 'u', 'x' vagy 'X' konverzió előtt az argumentum értéke C short típusának megfelelően csonkolódik.
l A format parancs figyelmen kívül hagyja.
Konverzió
A konverziós specifikáció egyetlen kötelező eleme. A következők állnak rendelkezésünkre:
d, i, o, u, x, X Az egész szám argumentumot előjeles decimális számként ('d' és 'i'), előjel nélküli oktális számként ('o'), előjel nélküli decimális számként ('u') vagy előjel nélküli hexadecimális számként ('x' - abcdef betűkkel, és 'X' - ABCDEF betűkkel) jelenik meg az eredményben. Ha pontosság is adott, akkor balról nullákkal egészül ki a konvertált szám a megfelelő mennyiségű számjegyre.
e, E A lebegőpontos argumentumot [-]d.dddeddd ('e') illetve [-]d.dddEddd ('E') alakú decimális számra konvertálja és kerekíti, ahol egy számjegy előzi meg a tizedespontot, a tizedesjegyek száma pedig megegyezik a pontossággal (ha nincs megadva: hattal). Ha a pontosság nulla, nem jelenik meg tizedespont. Az 'e'/'E' utáni szám legalább kétjegyű.
f A lebegőpontos argumentumot [-]ddd.ddd alakú decimális számra konvertálja és kerekíti. A tizedesjegyek száma megegyezik a pontossággal (ha nincs megadva: hattal), ha a pontosság nulla, nem jelenik meg tizedespont. Ha van tizedespont, legalább egy számjegy lesz előtte.
g, G A lebegőpontos argumentumot 'f' vagy 'e' illetve 'E' konverzió szerint konvertálja. A pontosság a szignifikáns jegyek számát ajda meg. Ha nem adott, az alapértelmezés 6; ha nulla, akkor egynek számít. Az 'e' vagy 'E' konverziót akkor használja, ha az exponens -4-nél kisebb vagy nem kisebb a pontosságnál. A tizedesjegyek közül elhagyja a felesleges nullákat, és tizedespont csak jelenik meg az eredményben, ha azt legalább egy tizedesjegy követi.
c Az egész szám argumentumot az általa megadott ASCII-kódú karakterre konvertálja.
s A string argumentumot változatlanul az eredménybe másolja. Ha a pontosság adott, akkor legfeljebb ennyi karaktert másol (jobbról csonkol).
% Egy '%' karaktert jelent.
A numerikus konverziókban az argumentumoknak egész vagy lebegőpontos számot reprezentáló stringeknek kell lenniük. Ezeket a format parancs binárisra konvertálja, majd a konverziós specifikációnak megfelelően vissza stringgé.
Például a '%2$-10.8hd' specifikációban a '$2' egy argumentumpozícíó, a '-' egy jelző, a '10' a szélesség, a '8' a pontosság, az 'h' egy típusmódosító, a 'd' pedig a konverziót szabja meg.

A szélességet és/vagy a pontosságot megadó szám helyett szerepelhet egy '*' is, ekkor az adott értéket a konverzió tárgyát megelőző egy vagy két egész szám argumentum adja meg.

A format parancs az ANSI C sprintf függvényétől az alábbiakban különbözik:

  • Nem támogatja a '%p' és '%n' specifikációkat.
  • A '%c' konverzió argumentuma egy decimális számot tartalmazó string, amely a megfelelő ASCII-kódú karakterre konvertálódik.
  • Az 'l' típusmódosító hatástalan. Az egész értékek úgy konvertálódnak, mint ha nem lenne 'l' jelen, lebegőpontos értékek pedig még az 'l' hiányában is úgy konvertálódnak, mintha ott lenne. A 'h' módosító a konverzió előtt a C short típusának megfelelőre csonkolja az értéket.
Stringek sscanf-szerű elemzése
A Tcl nemcsak a C könyvtár sprintf függvényének megfelelő format parancsot implementálja, hanem egy, a sscanf függvénynek megfelelő parancsot is:
scan string séma változónév ?változónév ...?
Az scan parancs a format-tal analóg elemző függvény, egy séma string alapján elemzi, konvertálja és tárolja a nevükkel megadott változókban az adatokat.

Az scan egyfajta mintaillesztést végez a string és a séma között, az argumentumokban megnevezett változókba bizonyos illesztett részek konvertáltjai kerülnek. A parancs visszatérési értéke azt adja meg, hogy hány argumentumot sikerült feltöltenie. Ezen érték és az argumentumok számának összevetésével eldönthető, hogy a string megfelelt-e a sémának.

Az séma közönséges karaktereket és '%' karakterrel kezdődő konverziós specifikációkat tartalmaz. A séma minden fehér karaktere a string fehér karaktereinek elvetését jelenti a következő nem fehér karakterig. Az eldobott karaktereknek nem kell megegyeznie a sémában szereplővel. A séma egyéb, konverziós specifikációnak nem részét képező karaktereinek pontosan meg kell egyeznie a string karaktereivel, különben illesztési hiba lép fel. A konverziós specifikációkra illeszkedő részek a specifikációra jellemző konverzió után a sorrendben következő változónak adódnak értékül.

A konverziós specifikáció a '%' karakter mögött az alábbi táblázatban ismertetett elemeket tartalmazhatja, a megadotts sorrendben:

Jelzők
Egyetlen jelzőt használhatunk:
* Csak az illesztést hajtja végre, de a konvertált értéket eldobja, nem használ argumentumot.
Szélesség
Azt adja meg, hogy legfeljebb hány karaktert kell a konvertálandó string részeként tekinteni. Ha nincs megadva, az alapértélmezés végtelen. A string illesztése az első nem illeszkedő karakternél, de legkésőbb a szélesség elérése után áll meg. A legtöbb konverzió az illesztés előtt eldobja a fehér karaktereket, ezek nem számítanak bele a szélességbe.
Típusmódosító
A C programozási nyelvvel való kompatibilitás érdekében 'h' vagy 'l' megadható, de a scan parancs figyelmen kívül hagyja.
Konverzió
A következők állnak rendelkezésünkre (ahol nincsen más megadva, a konverzió az illesztés előtt eldobja a soron következő fehér karaktereket):
% Egy '%' karakterre illeszkedik. Konverzió és értékadás az argumentumokba nem történik.
d Egy előjeles vagy anélküli decimális egészre illeszkedik.
i Egy előjeles vagy anélküli egészre illeszkedik. Az egészt hexadecimálisként értelmezi, ha az "0x"-szel vagy "0X"-szel kezdődik, oktálisként, ha nullával kezdődik, különben pedig decimálisként. Csak a számrendszernek megfelelő számjegykaraktereket fogad el.
o Egy oktális egészre illeszkedik.
u Egy előjel nélküli decimális egészre illeszkedik.
x Egy előjel nélküli hexadecimális egészre illeszkedik.
e, f, g Egy előjeles vagy anélküli lebegőpontos számra illeszkedik.
s Nem fehér karakterek sorozatára illeszkedik.
c Egyetlen karaktert illeszt, és ASCII-kódjára konvertálja. Konverzió előtt nem dobja el a soron következő fehér karaktereket.
[ Megengedett karakterek nemüres sorozatára illeszkedik. Konverzió előtt nem dobja el a soron következő fehér karaktereket. A megengedett karakterek a '[' karakter és a lezáró ']' karakter között megadottak, például "[abc]". Ha a '['-t közvetlenül '^' követi, akkor a megengedett karakterek a fel nem soroltak lesznek, például "[^0123456789]". A ']' karaktert úgy adhatjuk meg, hogy közvetlenül a '[' vagy '^' mögé írjuk. A kötőjel karakterrel egész intervallumot adhatunk meg, például "[0-9A-Fa-f]". A kötőjel karaktert a ']' elé írva elveszti speciális szerepét. Az illesztésnek az első nem megengedett karakter (vagy a maximális szélesség) elérésekor van vége.
Az illesztés mindig a lehető legnagyobb hosszon történik, például egy '%d' specifikáció illesztése akkor fejeződik be, ha a következő karakter számjegytől különböző, vagy már a szélességben megadott darabszámú karakter illeszkedett.

A scan parancs az ANSI C sscanf függvényétől a következőkben tér el:

  • Nem támogatja a '%p' és '%n' specifikációkat.
  • A '%c' konverzióban nem adható meg szélesség, egyetlen karaktert az ő ASCII-kódját reprezentáló decimális stringre konvertál.
  • Az 'l' és 'h' típusmódosítók hatástalanok. Az egész értékek úgy konvertálódnak, mint ha nem lenne típusmódosító jelen, lebegőpontos értékek pedig még típusmódosító hiányában is úgy konvertálódnak, mintha ott lenne az 'l'.
Listák
A lista nagyon általános és kényelmesen használható adatszerkezet, nem véletlen, hogy több programozási nyelvben is, például a LISP-ben vagy a Prologban, központi helyet foglal el. A Tcl is erősen épít a listákra, még akkor is, ha nem láncoltan, hanem stringekre visszavezetve ábrázolja őket.

Tulajdonképpen már a Tcl alapjait tárgyaló fejezetben megjelenik, hogy a listát milyen módon reprezentálják a stringek, ugyanis a lista szintaxisa megegyezik a parancséval. A különbség mindössze annyi, hogy az alkotókat nem szavaknak, hanem elemeknek nevezzük, és hogy a listában nincsen értelmezve változó- és parancshelyettesítés.

Az idézőjelek és a kapcsos zárójelek a szóközöket tartalmazó listaelemek egybefogására valók, például:

   első második {szóközt tartalmaz} negyedik
Célszerűbb a kapcsos zárójeleket használni, mert azok az idézőjelekkel szemben egymásbaágyazhatók:
   első második {beágyazott {beágyazottba ágyazott} lista} utolsó
A backslash lehetővé teszi, hogy a listaelemek idézőjeleket vagy kapcsos zárójeleket tartalmazzanak:
   idézőjel \" nyitó \{ záró \}
Amikor parancs részeként adunk meg listát, kapcsos zárójelekkel kell leárnyékolnunk a helyettesítésektől:
   set l {egy két há négy}
A listák elemeit Tcl-ben nullától kezdve indexelik, vagyis a lista első eleme a nulladik indexű.

Listák létrehozássa

Listát legegyszerűbben az elemeiből hozhatunk létre a
list ?elem ...?
paranccsal. A list az elem argumentumokból álló listát adja vissza (argumentumok híján üres stringet). Az elemeket megfelelő módon kiegészíti kapcsos zárójelekkel és backslash-ekkel, ha szóközöket vagy speciális karaktereket tartalmaznak. Már létező listákat a
concat ?lista ...?
parancs fűzi össze újabbakká. Ehhez a concat parancs argumentumai elejéről és végéről eltávolítja a szóközöket, majd egy-egy szóközzel összeragasztja őket. Listák módosítása
linsert lista index elem ?elem ...?
Az linsert parancs egy vagy több elemet szúr be listába az index-edik elem elé, és visszaadja az így keletkező új listát. Ha index nulla vagy negatív, akkor az elemek a lista elejére kerülnek. Ha end-et, vagy a lista elemeinek számánál nem kisebb értéket adunk meg indexnek, az elemek a lista végéhez fűződnek hozzá. A lista végéhez fűzés gyakori speciális esete a listába történő beszúrásnak, ezért ezt egy külön parancs is támogatja:
lappend változónév ?elem ...?
Az lappend adott változóban tárolt listához fűz hozzá tetszőleges számú elemet. Ha a változó még nem létezik, akkor a felsorolt elemeket tartalmazó listaként jön létre. A lappend parancs - különösen hosszú listák esetén - sokkal hatékonyabban működik, mint a concat vagy linsert parancsok, mert a listát nem másolja le fizikailag.
lreplace lista kezdet vég ?elem ...?
Az lreplace parancs törli listából a kezdet indextôl a vég indexig az elemeket, beszúrja helyükre a megadottakat, és visszaadja az így keletkező új listát. Ha nem adunk meg elemeket, értelemszerűen csak törlés történik. Ha kezdet negatív, a lista első elemét jelöli. Vég nem lehet kisebb kezdetnél. Mindkét index helyén állhat end, ami a lista utolsó elemét jelenti. Listák lekérdezése
llength lista
Ez a parancs lista elemeinek számát adja vissza.
lindex lista index
Az lindex parancs lista index+1. elemét adja vissza. Ha a hivatkozott index nem szerepel a listában, üres string az eredmény. Index lehet end is, ez az utolsó elemet jelenti.
lrange lista kezdet vég
Az lrange lista kezdet és vég indexek közé eső részét adja vissza. Mindkét index lehet end. Kezdet nullának számít, ha negatív, és vég end-nek, ha nagyobb vagy egyenlő a lista elemeinek számával.

Ha a két egyenlő indexet adunk meg, az eredmény akkor is egy lista lesz; például kapcsos zárójelek közé lesz zárva, ha tartalmaz szóközöket.

Keresés listákban

lsearch ?illesztés? lista minta
Az lsearch parancs mintának megfelelő elemet keres listában. Ha talál, az első illeszkedő elem indexét, ha nem talál, -1-et ad vissza. Az illesztés argumentum határozza meg, hogy mintát hogyan kell értelmezni:
-exact
A listaelemnek azonosnak kell lennie a mintával.
-glob
A minta a string match parancsban megengedett minta, és az illesztés ennek értelmében történik. Ez az alapértelmezés.
-regexp
A minta egy reguláris kifejezés, és az illesztés a regexp parancsnak megfelelő.

Listák rendezése

lsort ?kapcsolók? lista
Az lsort parancs a lista rendezett permutációját adja vissza. A rendezés módját kapcsolókkal adhatjuk meg:
-ascii
Lexikografikus rendezés ASCII-kód szerint. Ez az alapértelmezés.
-integer
Egész számokat tartalmazó lista numerikus rendezése.
-real
Lebegőpontos számokat tartalmazó lista numerikus rendezése.
-command parancs
Rendezés parancs szerint. Két elem összehasonlításához a parancsból és a két elemből álló script fut le. A scriptnek negatív értéket, nullát, vagy pozitív értéket kell visszaadnia aszerint, hogy az első elem rendre kisebb, egyenlő vagy nagyobb a másodiknál.
-increasing
Rendezés növekvő sorrendben. Ez az alapértelmezés.
-decreasing
Rendezés csökkenő sorrendben.
tcl8.0  
-dictionary
Szótári rendezést valósít meg. Abban különbözik az -ascii rendezéstől, hogy nem különbözteti meg a kis- és nagybetűket (csak teljes egyezés esetén), és a stringbe ágyazott számokat számként és nem karakterekként hasonlítja össze.
-index index
Listák listájának rendezése esetén mely elemeket hasonlítsa össze az allistákból.

Listák és stringek közötti konverzió

split string ?elválasztók?
A split parancs stringet feldarabolja az elválasztók stringben megadott karakterek közé eső részekre, és visszaadja a részeket tartalmazó listát. Ha string első vagy utolsó karaktere elválasztókarakter, vagy két elválasztókarakter közvetlenül egymás mellett szerepel benne, a lista megfelelő elemei üres stringek lesznek. Az alapértelmezett elválasztókarakterek a fehér karakterek. Például
   split heureka.inf.elte.hu .
eredménye 'heureka inf elte hu'.
join lista ?összekötő?
A join parancs lista elemeit az összekötő stringgel egyetlen stringgé köti össze, amelyet visszaad. Az összekötő alapértelmezésben egy szóköz.
Stringek

A string a Tcl egyetlen valódi adattípusa. A parancsok argumentumai és visszatérési értékei is stringek. A további adattípusokat (listák, számok) is stringekkel reprezentálja.

tcl8.0   8.0-tól kezdve már a Tcl_Obj struktúrákon alapul az adatok tárolása, így a stringeké és a listáké is. Ez hatékony tárolást tesz lehetővé, és elkerülhetők a felesleges konverziók.

Kiegészítések, módosítások: Sarlós Tamás, Nagy Viktor