TCL

**Tcl** ( բառից, «հրամանային գործիքների լեզու», կարդացվում է որպես «թիքլ» կամ «թի-սի-էլ») բարձր մակարդակի սկրիպտային լեզու։ Շատ լավ է աշխատում «տողերի» (string) հետ։ Նրանով կարելի շատ արագ կատարել տեքստերում մասսայական փոփոխություններ, կոնկրետ կոնտեքստում որոնել անհրաժեշտ տեքստը։ Այս լեզուն մեծ կիրառություն ունի համակարգչային մի շարք ծրագրերում (օրինակ. ModelSim) հրամանների ավտոմատացման համար։

Tcl-ն հաճախ օգտագործվում է գրաֆիկական Tk (Tool Kit) ինտերֆեյսով, դրա համար շատ հաճախ օգտագործում են Tcl/Tk հասկացողություն։ Tcl-ն օգտագործվում է կոնսոլային ծրագրերին գրաֆիկական ինտերֆեյս տալու և թեսթավորման համար, ինչպես նաև օգտագործվում է վեբ ծրագրավորման ոլորտում։

Tcl-ը Perl և Python ծրագրերի հետ դարձել է ընդհանուր նշանակության երեք դասական լեզուներից մեկը։ Այս եռյակը ոչ միայն համարվում է ActiveState-ի կողմից տրամադրվող ազատ դիստրիբուտիվ, այլ այնպիսի լեզուներ, որոնցով կարելի է գրել տվյալների բազաների պահպանման և տրիգերների հետ աշխատանքի ծրագրեր։

Որպես ներդրված լեզու Tcl-ը կիրառություն է գտել Ավտոմատացված նախագծման համակարգեր ոլորտում։ Այն, օրինակ, Unigraphics պոստպրոցեսորում օգտագործվում է որպես տվյալների բազայի ղեկավարման միջոց։ Բացի այդ Tcl-ը միկրոսխեմաների ոլորտի ծրագրային փաթեթների համար (Ծրագրավորվող լոգիկական ինտեգրալային սխեմա և ASIC) համարվում է ավտոմատացման և ինտեգրացման դե ֆակտո ստանդարտ լեզու։

## Պատմություն
Tcl ծրագրավորման լեզուն ստեղծվել է 1988 թվականի գարնանը՝ Ջոն Օուստերհուտի կողմից Կալիֆորնիայի Բերկլիի համալսարանի հետ համագործակցությամբ։

## Tcl լեզվի շարահյուսությունը
Tcl լեզվի շարահյուսությունը պարունակում է երկու կարևոր միավոր․ *սկրիպտ* և *հրաման*։
* **Սկրիպտը** նոր տողի նիշով կամ կետ֊ստորակետ (`;`) նիշով իրարից բաժանված հրամանների հաջորդականություն է։
* **Հրամանը** մեկ կամ ավելի արտահայտությունների շարք է՝ իրարից անջատված բացատանիշերով։ Այդ արտահայտություններից առաջինը հրամանի գործողությունն է, իսկ հաջորդները՝ արգումենտները։

```tcl
commandName argument1 argument2 ... argumentN
```


Հրամանի որևէ արգումենտ կարելի է փոխարինել մեկ այլ հրամանով՝ դրա համար օգտագործելով հրամանների ներդրման `[` և `]` փակագծերը։ Օրինակ, հետևյալ հրամանում `command_f` գործողությոն երկրորդ արգումենտում տրված է `incr` հրամանի կիրառություն․

```tcl
command_f 12 [incr i]
```


Այլ կերպ ասած, քառակուսի փակագծերը կատարում և վերադարձնում են իրենց ներսում գրված հրամանի արժեքը։ Եթե անհրաժեշտ է հրամանին փոխանցել չհաշվարկվող մի արտահայտություն, ապա վերջինս պետք է վերցնել *ձևավոր* փակագծերի մեջ։ `{` և `}` փակագծերում վերցրած ցանկացած արգումենտ հրամանին փոխանցվում է անպես ինչպես գրված է։

### Հատուկ նշանակության սիմվոլներ
* $ — փոփոխականի ներդրման գործողություն։ Վերադարձնում է փոփոխականի արժեքը։
* [] — հրամանի ներդրման գործողություն։ Վերադարձնում է փակագծերում բերված հրամանի արժեքը։
*  — խմբավորում է արգումենտները մի արգումնետի տեսքով։
* {} — խմբավորում է արգումենտները մի արգումնետի մեջ։
* \  — էկրանավորում է իրենից հետո գտնվող սիմվոլը։ Օգտագործվում է հատուկ նշանների հետ։
* #  — մեկնաբանության սկզբի նշան։ Պետք է դրվի նոր տողից կամ կետ-ստորակատից (;) հետո։

### Նոթեր սկրիպտի աշխատանքային պրոցեսի վերաբերյան
* Ամեն մի հրամանի վրայից անցնելով սկրիպտն այն բաժանում է ըստ բառերի, ներդնում է փոփոխականների արժեքները և կատարում է ենթահրամանները։
* Բոլոր սիմվոլները, որոնք գտնվում են {} և "" նշանների միջև, դիտարկվում են որպես մի տող։
* Հրամանի առաջին բառը դիտարկվում է որպես ներդրված հրաման կամ արդեն հայտնի *պրոցեդուրա*։

## Օգտագործման օրինակներ
### Բարև, աշխարհ
Բարև, աշխարհ ծրագիրն ունի հետևյալ տեսքը։

```tcl
puts "Բարև, աշխարհ"
```

Կամ այսպես

```tcl
puts {Բարև, աշխարհ}
```


### Զանգվածներ
#### Զանգվածի արժեքի հարցում
Զանգվածի անդամներն ամբողջությամբ կարող ենք ստանալ array get հրամանով

```tcl
array set colornum {
       white 1
       green 2
       blue 3
       red 4
       yellow 5
}
array get colornum
```


#### Զանգվածի անդամների գումար
Մեթոդ (Ա) — գումարի ստացում 'foreach' ցիկլի օգտագործումով

```tcl
set numbers {1 2 3 4 5 6 7 8 9 10}
set result 0
foreach number $numbers {
    set result [expr {$result + $number}]
}
puts $result
```


Մեթոդ (Բ) — ավելի էլեգանտ ձև` օգտագործելով 'join' հրամանը

```tcl
set numbers {1 2 3 4 5 6 7 8 9 10}
puts [expr [join $numbers +]]
```


#### Զանգվածի պարունակության ցուցակ
*tcl_platform* զանգվածում տեղեկություն է պահպանվում այն հարթակի մասին, որի վրայից կանչվել է Tcl-ը։
Այդ ցանկը կարելի է դուրս բերել հետևյալ կերպ.


```tcl
array names tcl_platform
```


Հետևյալ հատվածը այդ ամենը դուրս է բերում իր արժեքների հետ միասին.

```tcl
foreach i [array names tcl_platform] {
    puts "$i = $tcl_platform($i)"
}
```


Եթե ուզում ենք, որ պարամետրերը լինեն խմբավորված, ապա կարող ենք կանչել

```tcl
foreach i [lsort [array names tcl_platform] ] {
    puts "$i = $tcl_platform($i)"
}
```


Այստեղ ներկայացված է ներդրված հրամաններ։ Հրամանների ներդրվածությունը կարող է լիլնել ցանկացած աստիճանի։ Նույն արդյունքին կարելի է հասնել նաև *parray* (առկա է սկսած Tcl 8.5) հրամանի օգնությամբ։

### Բազմությունների հատում
*filter* պրոցեդուրան ցուցակից վերադարձնում է այն էլեմենտները, որոնց համար *script*-ն ընդունում է TRUE արժեք.

```tcl
proc filter {list script} {
    set res {}
    foreach e $list {if {[uplevel 1 $script $e]} {lappend res $e}}
    return $res
}
```

*uplevel 1* հրամանը թույլ է տալիս կոնտեքստից դուրս բերել արտահայտությունը, որտեղ կանչվում է *filter* բառը։

*in* պրոցեդուրան դա զանգված ստեղծելու կրճատված տարբերակ է.

```tcl
proc in {list e} {
    expr {[lsearch -exact $list $e]>=0}
}
```


Ստուգում։

```tcl
% filter {a b c} {in {b c d}}
b c
```


### Ֆակտորիալ

```tcl
proc ! x {expr {$x<2? 1: $x*[! [incr x -1]]}}
\! 5
```

Այստեղ ցույց է տրվել, որ պրոցեդուրայի հրաման կարող է լինել ցանկացած տող, ինչպես նաև մյուս լեզուներում հայտնի *?:* օպերատորը։

## Տես նաև
* Tk
* Forth
* SQLite
* Perl
* Expect

## Արտաքին հղումներ
* www.tcl.tk — Պաշտոնական կայք էջ
* wiki.tcl.tk — Tcl Wiki։ Tcl լեզվին նվիրված ռեսուրս
* tmml.sourceforge.net/doc — Официальная документация по Tcl/Tk-ի և Tcl-ի պաշտոնական փաստաթղթեր
* www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html — Tcl 8.5-ի դասագիրք
* :en:b:Tcl Programming  — Վիքիդասագիրք «Ծրագրավորում TCL լեզվով»
* pleac.sourceforge.net/pleac_tcl — PLEAC-Tcl — TCL-ով լուծված խնդիրների ժողովածու (հարմար է ուրշ լեզուների հետ համեմատելու համար)

### Ռուսերեն լեզվով
* www.opennet.ru/links/sml/36.shtml, հղումներ ռուսական փաստաթղթերին
* community.livejournal.com/ru_tcl, Tcl ծրագրավորողների ընկերություն
* www.cs.tut.fi/~yk/ns2ru/tcl.html , TCL լեզվի կարճ ներածություն
* tclstudy.narod.ru/index.html, tcl և tk սովորելու ինքնուսույց
* www.cs.tut.fi/~yk/ns2ru/otcl.html  — OTCL-ի ներածություն
* http://chatlogs.jabber.ru/tcl@conference.jabber.ru, Tcl լեզվի Jabber-կոնֆերանցիայի հաղորդագրությունների պատմություն

; Բլոգներ, նվիրված TCL-ին
* geomapx.blogspot.com, AOL Server-ի, tclsqlite որոշ գրադարանների և սկրիպտների նկարագրություն
* արժանի հոդվածներ Ա. Կովալենկոյի կողմից

#### Հոդվածներ
* XXI դարի բարձր մակարդակի ծրագրավորման սցենարներ — Ջոն Օստերաուտի հոդվածը (Tcl լեզվի) սցենարային լեզուների մասին։
* Հին, նոր, ապագա, Անդրեյ Զուբինսկիյի հոդվածների շարք «Համակարգչային տեսությունում».
* PostgreSQL-ի հասանլիություն Tcl լեզվում` հոդված CitForum կայքում
* Ուիլյամ Բ. Ցիմերլի. Tcl տեխնոլոգիա` Օգտագործեք Tcl/Tk աշխատանքային սեղանը կարգավորելու և ձեր աշխատանքն ավտոմատացնելու համար։

## Գրքեր
### Ռուսերեն լեզվով
* Брент Б. Уэлш, Кен Джонс, Джеффри Хоббс «Практическое программирование на Tcl и Tk», ISBN 5-8459-0661-X,
: բնօրինակը. Brent Welch, Ken Jones, Jeffrey Hobbs «Practical Programming in Tcl and Tk», ISBN 0-13-038560-3 (էլեկտրոնային տարբերակ)
* Москвин П. В. «Азбука TCL», ISBN 5-93517-130-9
* Алексей Петровский, Командный язык программирования TCL (Tool Command Language), ISBN 5-901321-16-2

### Անգլերեն լեզվով
* Clif Flynt «Tcl/Tk, Second Edition : A Developer’s Guide», ISBN 1-55860-802-8
: 1-е издание «Tcl/Tk for Real Programmers», ISBN 0-12-261205-1
* John K. Ousterhout, «Tcl and the Tk Toolkit», ISBN 0-201-63337-X
* Mark Harrison, Michael McLennan, «Effective Tcl/Tk Programming. Writing Better Programs in Tcl and Tk», ISBN 0-201-63474-0
* J. Adrian Zimmer «Tcl/Tk For Programmers», ISBN 0-8186-8515-8
* «Tcl/Tk Cookbook» from Lakshmi Sastry Advanced Interactive Systems Group(электронная книга )
* Salvatore Sanfillipo «Tcl Wise. Guide to the Tcl Programming Language» (первые 9 глав on-line )
* Paul Raines, Jeff Tranter «Tcl/Tk in a Nutshell: A Desktop Quick Reference», ISBN 1-56592-433-9
* Chad Smith «[incr Tcl/Tk] from the Ground Up», ISBN 0-07-212106-8
* David Maggiano «CGI Programming with Tcl», ISBN 0-201-60629-1
* J. M. Ivler, Kamran Husain, «Cgi Developer’s Resource: Web Programming in Tcl and Perl», ISBN 0-13-727751-2

## Ծանոթագրություններ

Կատեգորիա:Ամերիկյան հայտնագործություններ
Կատեգորիա:Օբյեկտ կողմնորոշված ծրագրավորման լեզուներ