A | B | C | D | E | F | G | H | CH | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Tcl logo | |
Paradigma | Multiparadigmatický: imperativní, strukturovaný, procedurální, funkcionální, objektově orientovaný, řízený událostmi |
---|---|
Vznik | 1988 |
Autor | John Ousterhout |
Vývojář | John Ousterhout, Tcl Core Team |
Poslední verze | 8.6.12 (31. října 2021) |
Poslední nestabilní verze | 9.0a3 (23. června 2021) |
Typová kontrola | dynamická |
Hlavní implementace | ActiveTcl, Androwish |
Dialekty | Jim |
Ovlivněn jazyky | Awk, Lisp |
Ovlivnil jazyky | PHP,[1] Tea, PowerShell[2] |
Licence | Stylu BSD |
Web | www.tcl.tk |
Tcl (vyslovuje se „tý-sý-el“ nebo „tykl“, název je zkratkou z Tool Command Language) je jednoduchý, ale účinný skriptovací jazyk, který v roce 1988 vytvořil John Ousterhout. Přes nezvyklou syntaxi je Tcl snadno zvládnutelný a díky nízkým nárokům na hardware je oblíbený především pro testování softwaru, programování vestavěných systémů a prototypování. V roce 1991 byl doplněn grafickým frameworkem Tk a výsledný systém nazývaný Tcl/Tk se stal až do nástupu Qt a GTK+ jedním z nejoblíbenějších nástrojů pro vytváření grafických uživatelských rozhraní. Framework Tk je dostupný v různých skriptovacích (Perl, Python, Ruby) i kompilovaných jazycích (C++, Ada). Logo jazyka v podobě pírka vychází z anglické slovní hříčky, neboť výslovnost názvu tykl je stejná jako u slova tickle = lechtat, šimrat. Pírko (brk) má navíc význam coby tradiční nástroj dávných písařů (prvních skriptérů).
Vlastnosti
Základní vlastnosti:
- imperativní a procedurální jazyk – program je tvořen posloupností příkazů
- rozšiřitelnost – uživatelem definované procedury se chovají jako vestavěné příkazy z knihovny jazyka; lze definovat i příkazy sloužící jako řídicí struktury, Tcl lze rozšiřovat pomocí funkcí v jazyce C, C++ a Java
- extrémně jednoduchá syntaxe – všechny příkazy (i řídicí struktury) mají jednotnou strukturu v prefixové notaci (výrazy ale používají obvyklou infixovou notaci)
- příkazy mohou mít proměnný počet parametrů
- všechny příkazy mohou být dynamicky předefinovány nebo přetíženy
- všechny datové typy i text programu jsou reprezentovány pomocí textových řetězců, výsledky funkcí lze vkládat přímo do textu programu; text programu se dá vytvářet za běhu
- proměnné mají implicitně oblast platnosti lokální ve funkci, v níž jsou použity; příkazy
uplevel
aupvar
umožňují přístup k proměnným z předchozích procedur v řetězci jejich volání; příkazglobal
umožňuje rozšířit oblast platnosti na celý zdrojový soubor - podpora jmenných prostorů
- podpora modulárního programování
- existují objektově orientovaná rozšíření
- všechny příkazy definované přímo jazykem Tcl generují při nesprávném použití chybová hlášení
- interpretovaný jazyk používající bytecode
- plná podpora Unicode 3.1 od roku 1999
- přenositelnost – samotný jazyk, i mnoho knihoven (včetně Tk) jsou nezávislé na platformě (Windows, Unix, Linux, Mac, Android)
- událostmi řízené rozhraní pro sokety a soubory; lze používat časové a uživatelem definované události
- úzká integrace s knihovnou grafického uživatelského rozhraní Tk
- obtížná práce se spojovými strukturami
Spuštění Tcl
Základní interpret jazyka Tcl – tclsh
– lze spustit bez parametrů a s Tcl pracovat interaktivně:
tclsh % expr 22/7 3 % expr 22/7. 3.142857142857143 % expr 4*atan(1) 3.141592653589793 % string length "nejneobhospodařovatelnějšími" 28 % exit
Znak procento (%
) je nápověda, kterou vypisuje interpret Tcl, a která je uváděna pouze u ukázek interaktivní práce. Příkaz expr
je nutné v Tcl používat pro vyhodnocování matematických výrazů. Lomítko je operátor dělení; pro dělení celých čísel se používá celočíselné dělení se zbytkem, použitím desetinné tečky u jednoho z operandů se vynutí reálné dělení. Hvězdička je operátor násobení; pro ukončení interpretu lze použít příkaz exit
nebo znak konce souboru, kterým je v Microsoft Windows a v MS-DOSu klávesová kombinace Ctrl-Z
, v Unixu Ctrl+D
. Aby bylo možné editovat příkazy pomocí kurzorových kláves, musí být nainstalován balíček tclreadline[3]; i bez něj lze příkazem history
vypsat seznam zadaných příkazů a zvolený příkaz znovu vyvolat zadáním vykřičníku a čísla příkazu.
Druhý interpret – wish
– je určený pro programy používající grafické uživatelské rozhraní:
wish % wm title . "Hlavní okno" % wm minsize . 320 200 % label .l -text "Nápis v hlavním okně" .l % pack .l -padx 40 -pady 20 % toplevel .w2 .w2 % wm title .w2 "Druhé okno" % label .w2.l -text "Nápis v druhém okně" .w2.l % pack .w2.l -padx 10 -pady 10 %
– spuštěním wish
se otevře hlavní okno okno aplikace; příkazy začínající wm
slouží pro komunikaci se správcem oken: wm title
změní text v záhlaví okna a wm minsize
předepíše jeho minimální velikost (šířka 320 pixelů a výška 200 pixelů); příkaz label
připraví nápis, který se provedením příkazu pack
zobrazí uvnitř okna; příkaz toplevel
vytvoří druhé okno, kterému se dalšími příkazy také změní text v záhlaví a ve kterém se vypíše další text; parametry začínající tečkou jsou obdobou cest používaných pro navigaci ve stromové struktuře adresářů na disku: samotná tečka označuje hlavní okno, .l
je prvek pojmenovaný l
ve hlavním okně, .w2
je druhé okno a .w2.l
je prvek ve druhém okně (na konkrétních jménech l
a w2
nezáleží). Příkazy vytvářející grafické prvky, jako label
a toplevel
, vracejí jméno prvku, které lze uložit do proměnných a používat v dalších příkazech.
Obvyklejší přístup je ale spouštění předem připravených programů neboli skriptů:
tclsh program.tcl parametr parametr ...
Parametry skriptu jsou dostupné jako seznam v proměnné argv
; počet parametrů lze tedy zjistit pomocí llength $argv
. Další možností je čtení proměnné argc
z globálního jmenného prostoru, tedy $::argc
. Jméno spuštěného skriptu je v proměnné argv0
.
Souborům s programy v jazyce Tcl se obvykle dává přípona .tcl
. Aby v Unixu bylo možné pouštět Tcl skripty pouze zadáním jejich jména, je potřeba dát souboru se skriptem právo execute a na jeho začátek přidat první čtyři řádky z následující ukázky:
#!/bin/sh
# -*- tcl -*-
# The next line is executed by /bin/sh, but not tcl \
exec tclsh "$0" ${1+"$@"}
puts "Hello, world!"
První řádek díky konstrukci Shebang zajistí, že se skript začne interpretovat programem /bin/sh; provedením příkazu exec
se spustí tclsh
, který začne číst soubor se skriptem zase od začátku, ale řádek s příkazem exec
považuje za pokračování komentáře z předchozího řádku díky jeho zakončení obráceným lomítkem.
Syntaxe a základní sémantika
Program (skript) v Tcl je tvořen posloupností příkazů. Každý příkaz začíná jménem příkazu, za kterým mohou následovat argumenty (parametry) oddělované od sebe navzájem i od jména příkazu vždy alespoň jednou mezerou nebo tabulátorem. Příkaz je ukončen koncem řádku nebo středníkem. Jména příkazů v Tcl nejsou vyhrazená slova, ani nemají v jazyce žádné zvláštní postavení; jsou to obyčejné, nijak neprivilegované, funkce v knihovně. Příkazy mohou mít proměnný počet argumentů.
příkaz argument1 argument2 ... argumentN
Pokud argumenty obsahují bílé znaky, musí být uzavřeny ve dvojitých uvozovkách nebo ve složených závorkách – pak může být argument i víceřádkový; pokud ale chcete odřádkovat mezi argumenty, je nutné bezprostředně před odřádkování napsat zpětné lomítko.
Symboly se zvláštním významem
$
– vrací hodnotu proměnné, jejíž jméno je uvedeno za znakem dolar– závorky včetně obsahu nahradí výstupem Tcl příkazu, který je v závorkách uzavřen
""
– obsah uvozovek považuje za jediný argument, přitom vyhodnocuje vnořené konstrukce s$
,a
\
{}
– obsah závorek považuje za jediný argument, ale na rozdíl od uvozovek nevyhodnocuje konstrukce se speciální znaky uvnitř\
– ruší zvláštní význam následujícího znaku nebo vytváří řídicí znak nebo znak se zadaným kódem#
– uvozuje komentář, který končí s koncem řádku; lze použít pouze v místě, kde může začínat příkaz
Apostrofy nemají v Tcl žádný zvláštní význam. Kulaté závorky se používají pro přístup k prvkům asociativních polí a pro vyjádření priority v aritmetických výrazech.
Příkaz puts
Příkaz puts
vypíše zadaný řetězec (který musí tvořit jedno slovo, proto je vhodné jej vždy uzavírat do uvozovek) následovaný znakem konce řádku, implicitně na standardní výstup (kanál stdout
):
puts "Hello, world!"
Pokud puts
nemá po vypsání řetězce odřádkovat, je potřeba před řetězcem použít volbu -nonewline
:
puts -nonewline "Hodnota proměnné i: "
puts $i
Před vypisovaným řetězcem lze uvést jméno výstupního kanálu (nebo proměnnou, která se odkazuje na soubor):
puts stderr "Chyba!"
Proměnné a příkaz set
Pro přiřazení hodnoty do proměnné slouží příkaz set
; pro získání obsahu proměnné je nutné před její jméno napsat znak dolar:
% set x 5 5 % puts "Hodnota proměnné x je $x." Hodnota proměnné x je 5.
Pokud je příkaz set
zadán v příkazovém řádku tclsh (tj. při interaktivním provádění), vypisuje se přiřazovaná hodnota; při provádění programu ne.
Přiřazení hodnoty výrazu do proměnné není tak jednoduché; je potřeba použít příkaz expr
a hranaté závorky pro dosazení výsledku příkazu do jiného příkazu:
% set stupnu_Fahrenheita 451 451 % set stupnu_Celsia 232.77777777777777
Před otevírací hranatou i složenou závorkou musí být mezera; první odděluje parametry příkazu set
, druhá jméno příkazu expr
od parametru.
Aby se odlišilo jméno proměnné od okolního textu, lze jej uzavřít do složených závorek ${jmeno}
:
% set a 2 2 % set b 3 3 % puts "${a}x$b=" 2x3=6
Tcl není staticky typovaný jazyk: každá proměnná může obsahovat hodnotu libovolného typu – např. celé číslo, reálné číslo, řetězec, seznam, jméno příkazu nebo slovník; hodnoty se převádějí na jiné typy podle potřeby automaticky (s omezeními danými syntaxí). Hodnoty jsou ale vždy konstantní (anglicky immutable); operace, které vypadají, že mění hodnoty, ve skutečnosti pouze vrací jinou hodnotu.
Asociativní pole
Asociativní pole je složená datová struktura, ve které se pro přístup k jednotlivým položkám používá klíč, kterým může být libovolný textový řetězec. S prvky asociativních polí se pracuje stejně jako s jednoduchými proměnnými:
set hlavni_mesta(ČR) "Praha"
set hlavni_mesta(Slovensko) "Bratislava"
set hlavni_mesta(Polsko) "Varšava"
set hlavni_mesta(Německo) "Berlín"
set hlavni_mesta(Rakousko) "Vídeň"
set stat Slovensko
puts "Hlavní městem státu $stat je $hlavni_mesta($stat)."
Asociativní pole lze také vytvořit pomocí příkazu array set
:
array set hlavni_mesta {
"ČR" "Praha"
"Slovensko" "Bratislava"
"Polsko" "Varšava"
"Německo" "Berlín"
"Rakousko" "Vídeň"
}
set stat Slovensko
puts "Hlavní městem státu $stat je $hlavni_mesta($stat)."
Oba skripty vypíšou:
Hlavní městem státu Slovensko je Bratislava.
Přítomnost prvku v poli lze testovat příkazem
info exists hlavni_mesta(Antarktis)
který vrací jedničku, pokud existuje zadaný prvek v zadaném poli; jinak vrací nulu.
Asociativní pole (jako celek) nelze vypisovat příkazem puts
; lze použít příkaz parray
ze standardní knihovny:
% puts $hlavni_mesta can't read "hlavni_mesta": variable is array % parray hlavni_mesta hlavni_mesta(Německo) = Berlín hlavni_mesta(Polsko) = Varšava hlavni_mesta(Rakousko) = Vídeň hlavni_mesta(Slovensko) = Bratislava hlavni_mesta(ČR) = Praha
Asociativní pole nelze předávat jako parametry procedur nebo je vracet jako návratové hodnoty funkcí; je možné použít příkazy array set
a array get
, které provádějí převod mezi asociativním polem a seznamem:
% array get hlavni_mesta Německo Berlín Polsko Varšava Slovensko Bratislava ČR Praha Rakousko Vídeň
Operátory seskupení
Před provedením každého příkazu Tcl provede vyhodnocení proměnných a vnořených příkazů (tzv. substituce nebo expanze). Substituci lze řídit pomocí operátorů seskupení. Jazyk Tcl má 3 operátory seskupení:
- Uvozovky
""
- Složené závorky
{}
- Hranaté závorky
Operátory seskupení propůjčují jazyku Tcl nezaměnitelný charakter, jsou však zároveň i příčinou, proč se mu mnoho programátorů vyhýbá.
Uvozovky
Uvozovky se chovají stejně jako v mnoha jiných skriptovacích jazycích: vytvářejí řetězec z posloupnosti slov a zároveň nezabraňují expanzi proměnných ani vyhodnocování příkazů zapsaných v hranatých závorkách. Pokud se mají do řetězce vložit uvozovky, je nutné před nimi napsat obrácené lomítko; obrácené lomítko také ruší význam dolaru jako prostředku pro expanzi hodnoty proměnné:
puts "Prvek $i pole \$arr má hodnotu \"$arr($i)\"."
Pokud je v proměnné i hodnota 8, a prvek pole $arr s indexem 8 (indexem může být i řetězec) obsahuje řetězec "osmička", vypíše se
Prvek 8 pole $arr má hodnotu "osmička".
V uvozovkách mají některé posloupnosti začínající znakem obrácené lomítko význam řídicích nebo jiných znaků:
Posloupnost | Význam |
---|---|
\n | Znak nový řádek (line feed) |
\r | Znak návrat vozíku (carriage return) |
\t | Znak tabelátor (tab) |
\v | Znak vertikální tabelátor (vertical tab) |
\a | Znak zvonek (bell) |
\b | Znak backspace |
\0nn | Znak se zadaným kódem (v osmičkové soustavě) |
\uHHHH | Unicode znak U+HHHH |
\xHH | Znak se zadaným kódem (v šestnáctkové soustavě) |
Hranaté závorky
Do hranatých závorek lze zapsat libovolný příkaz Tcl včetně parametrů; příkaz v hranatých závorkách se provede před provedením příkazu, ve kterém je použit, a hranaté závorky se nahradí výstupem, který vyprodukuje. V následujícím příkladu je použit příkaz clock seconds
, který vrací počet sekund od 1. 1. 1970 a příkaz clock format
, který tento údaj zformátuje podle parametru uvedeného za volbou -format
:[4]
puts "Od 1. ledna 1970 uplynulo sekund;"
puts "Je rok clock seconds -format "%Y"."
vypíše
Od 1. ledna 1970 uplynulo 1366380049 sekund; Je rok 2013.
Jak je vidět, hranaté závorky a uvozovky lze vnořovat.
Nejčastější příkaz, který se píše do hranatých závorek, je příkaz expr
, který vyhodnocuje aritmetické výrazy:
set vyraz "1+2+3+4+5+6+7+8+9+10"
set vysledek expr $vyraz
puts "Součet $vyraz je $vysledek."
Vypíše
Součet 1+2+3+4+5+6+7+8+9+10 je 55.
Substituce pomocí hranatých závorek umožňuje použít výsledek jednoho příkazu jako argument dalšího příkazu. Pokud se má vyvolat příkaz jako funkce, která vrací hodnotu, musí se vždy uzavřít do hranatých závorek.
Tcl nepotřebuje operátor pro spojení řetězců, protože stačí jenom zapsat proměnné nebo příkazy v hranatých závorkách za sebe. Na rozdíl od unixových interpretů příkazů vyhodnocuje Tcl každý řetězec pouze jednou (pokud skript přímo nepředepisuje opakované vyhodnocení), což trochu komplikuje interaktivní použití, ale zprůhledňuje chování ve skriptech (např. mezery ve jméně souboru nepůsobí potíže známé z unixových shellů).
Složené závorkyeditovat | editovat zdroj
Složené závorky se chovají jako apostrofy v unixových interpretech příkazů a některých skriptovacích jazycích – jejich obsah se bere jako jedno slovo a nijak se neexpanduje (jen se ignoruje konec řádku, před kterým je zpětné lomítko). Složené závorky se mohou používat pro zápis řetězců, které se mají interpretovat přesně tak, jak jsou zapsány, v Tcl však mají mnohem širší použití – pro zápis seznamů a řídicích struktur. Cyklus s testem na začátku se v Tcl zapisuje jako příkaz while
, za kterým následují dvě slova – první je podmínka, druhé je tělo cyklu. Tcl nevyžaduje žádné závorky, do kterých by se podmínka a tělo cyklu uzavíralo, ale nejsnazší způsob, jak podmínku i tělo cyklu zapsat jako jedno slovo, je uzavřít je do složených závorek. Díky tomu se zápis while cyklu v Tcl podobá zápisu v jazyce C. Podobným způsobem se zapisuje definice funkce (první parametr za slovem proc
je jméno procedury nebo funkce, druhý seznam parametrů, třetí tělo funkce), podmíněný příkaz (první parametr za slovem if
je podmínka, druhým seznam příkazů, které se mají provést, je-li podmínka splněna, pak mohou následovat části elseif
a else
).
Do složených závorek se také uzavírají matematické výrazy vyhodnocované příkazem expr
.
Pokud by se v příkazu puts
použitém v části „Uvozovky“ nahradily vnější uvozovky složenými závorkami:
puts {Prvek $i pole \$arr má hodnotu \"$arr($i)\".}
výsledný výstup by vypadal značně odlišně; pravděpodobně úplně jinak, než bylo zamýšleno:
Prvek $i pole \$arr má hodnotu \"$arr($i)\".
Pokud jsou složené závorky vnořeny do jiných složených závorek, hranatých závorek nebo uvozovek, chovají se jako normální znak:
puts "Prvek {$i} pole \$arr má hodnotu {$arr($i)}."
vypíše
Prvek {8} pole $arr má hodnotu {osmička}.
Do složených závorek se uzavírají výrazy v příkazu expr
, aby se zabránilo dvojí expanzi jména proměnných:
set i 10
set d "\$i"
puts expr 2*$d
Řídicí strukturyeditovat | editovat zdroj
V Tcl jsou dostupné obvyklé řídicí struktury:
if
elseif
else
– podmíněný příkazswitch
– vícecestné větveníwhile
– cyklus s testem na začátkufor
– cyklus s řídicí proměnnouforeach
– cyklus přes prvky seznamu
Díky vynalézavému použití složených závorek je zápis řídicích struktur podobný jako v jazyce C; v Tcl se však do složených závorek píšou nejen příkazy, ale i podmínky. Interpretu Tcl je skutečnosti jedno, jaké operátory seskupení se použijí (a jestli vůbec nějaké). Vyžaduje pouze, aby slova uvozující jednotlivé konstrukce měly správný počet argumentů/parametrů. Například v příkazu cyklu while
musí být za jménem příkazu dva argumenty: první je podmínka, druhý tělo cyklu. A nejjednodušším způsobem, jak sdělit Tcl, že určitý text má považovat za jeden parametr, je uzavřít jej do složených závorek. Protože parametry musí být odděleny aspoň jednou mezerou, musí být vně složených závorek (tj. před {
a za }
) vždy aspoň jeden bílý znak (mezera nebo tabelátor). Otevírací závorka těla cyklu musí být na stejném řádku jako podmínka (nebo musí být předchozí řádek zakončen zpětným lomítkem).
Podmíněný příkazeditovat | editovat zdroj
Následující program ukazuje syntaxi podmíněného příkazu v Tcl; část else
je nepovinná, příkaz může mít libovolný počet částí elseif
:
if {$i > 0} {
puts "$i je kladné číslo"
} elseif {$i == 0} {
puts "$i je nula"
} else {
puts "$i je záporné číslo"
}
While cykluseditovat | editovat zdroj
Následující ukázka použití while
příkazu počítá Ludolfovo číslo podle vzorce
kde funkce arkus tangens se počítá pomocí Taylorova vzorce
Antropológia
Aplikované vedy
Bibliometria
Dejiny vedy
Encyklopédie
Filozofia vedy
Forenzné vedy
Humanitné vedy
Knižničná veda
Kryogenika
Kryptológia
Kulturológia
Literárna veda
Medzidisciplinárne oblasti
Metódy kvantitatívnej analýzy
Metavedy
Metodika
Text je dostupný za podmienok Creative
Commons Attribution/Share-Alike License 3.0 Unported; prípadne za ďalších
podmienok.
Podrobnejšie informácie nájdete na stránke Podmienky
použitia.
www.astronomia.sk | www.biologia.sk | www.botanika.sk | www.dejiny.sk | www.economy.sk | www.elektrotechnika.sk | www.estetika.sk | www.farmakologia.sk | www.filozofia.sk | Fyzika | www.futurologia.sk | www.genetika.sk | www.chemia.sk | www.lingvistika.sk | www.politologia.sk | www.psychologia.sk | www.sexuologia.sk | www.sociologia.sk | www.veda.sk I www.zoologia.sk