Limbajul Tool Command Language Tcl

Cuprins

Inițiere in Tcl\Tk ………………………………………………………..

Inițiere ………………………………………………………………….

Variabilele Tcl …………………………………………………………

1.3 Substituirea Instrucțiunilor ……………………………………………

1.4 Expresii matematice ……………………………………………………

1.5 Substituiri Backslash …………………………………………………..

1.6 Gruparea cu paranteze figurate și apostrof dublu …………………..

1.7 Rezumat la Grupări și Substituiri …………………………………….

2. Proceduri Tcl ………………………………………………………….

2.1 Domenii …………………………………………………………………

2.2 Instrucțiunea Global ……………………………………………………

2.3 Folosirea masivelor pentru declarații globale ………………………..

2.4 Instrucțiunea upvar …………………………………………………….

3. Comentarii ……………………………………………………………….

4. Șiruri de caractere ……………………………………………………….

5. Potrivire cu un Șablon ……………………………………………………

5.1 Expresii Regulate ………………………………………………………..

5.2 Caractere de potrivire …………………………………………………..

6. Structuri de date Tcl ………………………………………………………

6.1 Listele ……………………………………………………………………..

6.2 Tablouri de elemente ……………………………………………………..

7. Comenzi de control a execuției programului ……………………………..

8. Evaluatorul Tcl …………………………………………………………….

8.1 Crearea codului cu ajutorul list ………………………………………….

8.2 Instrucțiunea eval ………………………………………………………….

8.3 Instrucțiuni care concatanează ……………………………………………

9. Instrucțuni Callbacks ……………………………………………………….

9.1 Instrucțiunea after ……………………………………………………………

9.2 Instrucțiunea fileevent ……………………………………………………….

9.3 Instrucțiunea send ……………………………………………………………

10. Descrierea Programului ……………………………………………………..

11. Listingul Programului ……………………………………………………….

12. Compartimentul Economic ………………………………………………….

13. Protecția Muncii ………………………………………………………………

14. Concluzie ………………………………………………………………………

15. Bibliografie ……………………………………………………………………

Bibliografie

Practical Programming in Tcl and Tk. Brent Welch, January, 13, 1995

www.tcl.tk

www.activestate.com

ActiveTcl Documentation Index.

=== ADNOTARE ===

Adnotare

Prezenta lucrare este o descriere generală a limbajului Tool Command Language (Tcl). Tcl a fost creat de către Jhon Osterhout profesor la universitatea din Berkley, în 1988. Osterhout a folosit Tcl ca limbaj de comandă pentru editorul și emulator de terminal al unui sistem de operare elaborat de el, împreună cu studenții lui. Mai tîrziu Osterhout a planificat o extensie X toolkit bazată pe Tcl și care ar permite cooperarea programelor interacționînd prin intermediul instrucțiunilor Tcl. Primele versiuni erau concepute ca fiind aplicații compilate și mici segvențe Tcl pentru folosite pentru configurare și instrucțiuni de nivel înalt. Pentru prima dată Tcl a fost dezvolat sub UNIX. Dar cu timpul el a fost portat pe Windows și Macintosh. Tcl a fost dezvoltat și modernizat și cu timpul a devenit un instrument puternic pentru crearea diferitor aplicații. Lucrarea de față este o descriere simplă a limajului. Aici sunt descrise principalele caracteristici limbajului Tcl. Sunt prezentate și exemple la fiecare capitol. În final este prezentat un simplu editor textual, pentru a arăta posibilitățile acestui instrument.

This diploma paper is a general description of Tcl. Tcl was created by Jhon Osterhout professor of Berkley University,in 1988. Osterhout used Tcl as command language for writing a new editor and terminal emulator of the operating system created by him and his students. He had plans for an X toolkit based on Tcl that would allow programs to cooperate by communicating with Tcl commands. That early vision imagined that applications would be large bodies of com-piled code and a small amount of Tcl used for configuration and high-level commands. Tcl was designed for UNIX. But in time it was ported on Windows and Macintosh. Tcl was developed and became a powerful instrument for building applications. This diploma paper is simple description of Tcl. It describes basic characteristics of Tcl. It gives some examples for each chapter. The simpe text editor was built in order to show possibilities of this instrument.

=== CONCLUZIE ===

Concluzie

Tcl dintr-un simplu limbaj de comandă, a devenit cu timpul un instrument puternic pentru crearea diferitor aplicații. Este folosit pentru elaborarea rapidă interfețelor grafice,în proesarea simbolică, precum și în Internet. La Tcl au fost adăugate extensii ca [incr Tcl], care permit lucrul cu obiecte. Principale sale avantaje sunt, sintaxa simplă, ușor de învățat, este un limbaj interpreativ, permite invocarea interpretorului din aplicație și un lucru important sunt expresiile regulate. Faptul că este interpretativ, poate fi compensat prin posibilitatea compilarii scriptului sau includerii segvențelor de program scrise în C.

=== ECONOMIC ===

Compartimentul Economic

Introducere

În condițiile economiei de piață, o importanță deosebită capătă competitivitatea agenților economici, care le asigură un segment permanent de activitate și venituri stabile. Pârghia principală a peții – concurența producătorilor analogi, nu le permite de a avea o poziție de stagnare în activitatea de producție, ba din contra, numai acceptând managementul schimbărilor se poate de a rezista condițiilor dure ale peții.

O pondere deosebită printre factorii de producție posedă dotarea tehnică a întreprinderii, care poate fi utilizată la maxim numai în condițiile automatizare ale ei. De aceea promovarea procedurilor operaționale sau de control și evidență a rezultatelor obținute au o importanță tot mai mare în relațiile de producție.

Acești factori determină necesitățile studenților specialităților facultății de „Calculatoare, Informatică și Microelectronică” în cunoașterea teoriilor macroeconomice, practicilor microeconomice și manageriale pentru a activa cu performanță și a corespunde abilităților unui specialist contemporan.

Pentru a corespunde acestor cerințe, autorul a elaborat acest îndrumar metodic, în care sunt prezentate cerințele teoretice și practice pentru întocmirea capitolului organizațional – economic al tezelor de licență la specialitățile facultății „Calculatoare, Informatică și Microelectronică”.

Capitolul organizațional – economic trebuie să fie o continuitate a compartimentelor inginerești, expuse de licențiat după formă și conținut în dependență de tema tezei de licență.

În capitolul organizațional-economic trebuie să fie descrise următoarele subiecte:

Planificarea și organizarea proceselor de producție care sunt determinate de proiectul ingineresc descris în lucrare.

Determinarea devizului de cheltuieli ce apar pe parcursul elaborării proiectului ingineresc.

Evaluarea eficienței economice(sau sociale) de la implementarea proiectului ingineresc.

În p. 1 se descrie procesul de producție pe operații, și apoi se organizează în spațiu, se determină toți parametrii tehnici, materiali și nu numai care sunt necesari pentru a efectua lucrările de proiectare.

În p. 2 al capitolului economic se determină costurile softurilor sau hardurilor elaborate, reieșind din articolele de cheltuieli și durata în timp a ciclului de producție

În p. 3 al capitolului se realizează aprecierea eficienței economice a produselor informatice, a elaborărilor, soluțiilor propuse în tezele de licență. În funcție de domeniul de cercetare – elaborare și tema tezei, atât metodica cît și indicatorii folosiți pentru evaluarea pot să difere.

Considerații generale.

Elaborarea și implementarea produselor informatice (produse program, baze de date, pagini Web, sisteme informatice etc.) indică cheltuieli esențiale, uneori considerabile, de resurse: umane, materiale, financiare. Pentru beneficiar este importantă justificarea acestor cheltuieli.

Implementarea produselor informatice este o cale de sporire a eficienței funcționării obiectului, procesului sau activității respective (în continuare obiectul). De aceea justificarea oportunității cheltuielilor cu produsele informatice se efectuează în baza aprecierii eficienței funcționării obiectului. Preponderent se consideră sporirea eficienței economice, la satisfacerea anumitor cerințe vizând valorile indicatorilor cu caracter neeconomic. Uneori, însă, pentru justificare se folosesc indicatori de eficiență cu caracter neeconomic, la satisfacerea anumitor cerințe vizând valorile indicatorilor economici. În ambele cazuri se calculează valorile unor indicatori economici. În continuare se consideră doar aspectele aprecierii eficienței economice a produselor informatice.

Eficiența economică caracterizează pe cît de reușite, din punct de vedere economic sunt soluțiile propuse. Pentru evaluarea eficienței economice se folosesc indicatori, care iau în considerație atât contribuțiile de la folosire (efectele utile), cît și cheltuielile (efortul făcut) cu produsele informatice.

Cheltuielile sunt constituite din investițiile pentru elaborarea și implementarea produselor informatice și cheltuielile de exploatare a acestora. Investițiile includ cheltuielile cu:

Elaborarea, procurarea și adaptarea produselor informatice;

Achiziționarea, închirierea și/sau fabricarea echipamentelor;

Construirea, arenda și/sau amenajarea spațiilor necesare;

Pregătirea și specializarea personalului;

Instalarea echipamentelor și implementarea produselor informatice.

La cheltuielile de exploatare a unui produs informatic se referă cheltuielile cu:

Salarizarea personalului;

Perfecționarea pregătirii cadrelor;

Întreținerea produselor program;

Întreținerea și reparația echipamentelor;

Materialele consumabile, energia electrică și amortizarea echipamentelor etc.

Contribuțiile produselor informatice se manifestă în îmbunătățirea funcționării sistemelor informatice și a obiectelor de aplicație respective. Folosirea unui produs informatic se soldează cu efecte directe, obținute în cadrul sistemului informatic, și efecte indirecte, obținute în cadrul obiectelor de aplicație. Efectul economic direct depinde de selectarea/elaborarea reușită a mijloacelor informatice și gradul de utilizare a facilităților acestora. Evaluarea efectelor economice directe se efectuează prin analiza economică a structurii costurilor de producție înainte de implementarea produselor informatice și ulterior implementării acestora.

Efectele economice indirecte de la folosirea produselor informatice duc la intensificarea activității obiectelor de aplicație. De regulă, volumul efectelor indirecte depășește considerabil volumul efectelor directe de la implementarea produselor informatice. Deseori, însă, evidențierea efectului obținut de la implementarea produselor informatice de cel obținut de la aplicarea altor măsuri este dificil.

De menționat, de asemenea, că pentru unele genuri de efecte economice un se reușește aprecierea în bani; mai mult ca atât, există genuri de efecte care în general nu pot fi decât în bani. În asemenea cazuri aprecierea se efectuează în mod indirect: se ia în considerație influența acestor factori asupra stării generale a obiectului de aplicații. Așa dar, de rând cu indicatorii cantitativi, la aprecierea efectului economic de la implementarea produselor informatice se cere luarea în considerație și a unor efecte calitative, de exemplu:

Îmbunătățirea caracterului și calității muncii;

Îmbunătățirea calității, conținutului și a formei de prezentare a informațiilor;

Sporirea gradului de securitate a informațiilor etc.

Scopul final al implementării produselor informatice constă în îmbunătățirea activităților cu prelucrarea informației. Ca scopuri particulare ar putea servi: reducerea cheltuielilor cu prelucrarea informației; creșterea veridicității și exactității informației; creșterea operativității obținerii informației necesare; obținerea unor informații noi, imposibil de obținut fără folosirea mijloacelor informatice etc.

Pentru aprecierea eficienței economice, ca indicatori pot servi: efectul economic anual, sporirea ratei și/sau a masei profitului, economia anuală de la reducerea costului producției, durata de recuperare a investițiilor, sporirea rentabilității fabricației, reducerea costului producției, sporirea productivității muncii, reducerea cheltuielilor de exploatare, reducerea laboriozității fabricației, reducerea numărului de personal, reducerea fondului de salarii, reducerea cheltuielilor materiale, reducerea normelor consumului de resurse, economia de la eliberarea mijloacelor circulante, economia de la creșterea calității producției, reducerea cheltuielilor cu uneltele de muncă, îmbunătățirea folosirii mijloacelor de producție, reducerea cheltuielilor neproductive, creșterea rentabilității fondurilor, îmbunătățirea condițiilor de muncă ale personalului, reducerea rezervelor mijloacelor circulante, creșterea volumului producției, reducerea ciclului de fabricație etc.

De asemenea, la compararea alternativelor de realizare, se folosesc și asemenea indicatori ca: cheltuielile exprimate anuale, volumul investițiilor capitale, coeficientul de risc al investiției ș.a.

Numărul total de indicatori ce pot fi folosiți pentru aprecierea produselor informatice depășește 200. Pentru sistematizare, aceștia se grupează în mai multe categorii de indicatori: generali, particulari; calitativi, cantitativi; de cost; tehnici, naturali; sintetici, analitici; complecși; de bază, auxiliari; inițiali, derivați; prestabiliți, necesari; specifici; de limită etc. Prevalează, totuși, evidențierea grupurilor de indicatori cantitativi și calitativi, indicatorii cantitativi fiind divizați, la rândul lor, în indicatori de bază și auxiliari.

La analiza economică a produselor informatice, alegerea indicatorilor pentru aprecierea alternativelor de soluții este de primă importanță. În funcție de produsul informatic cercetat și domeniul utilizării acestuia, setul de indicatori folosit poate fi diferit. Totodată unii indicatori pot fi folosiți ca criterii de optimizare la selectarea alternativelor, iar valorile altora ca restricții necesare. Ca restricții la crearea produselor informatice deseori se folosesc: volumul maxim admis de investiții, durata minimă admisă de recuperare a investițiilor ș.a.

Selectarea indicatorilor pentru aprecierea eficienței economice și definirea restricțiilor este prerogativa beneficiarului.

Graful-rețea. Tabelul 1.

Tabelul 2 Durata efectuării lucrărilor.

Din graf vedem că proectul durează 34 zile plus o zi rezervă și obținem 35 zile sau 7 săptămîni cu 5 zile lucrătoare, 8 ore pe zi. Salariul săptămînal este de 500 Lei.

Componența grupului de lucru. Tabelul 4.

Salariu de bază pe durata proectului alcătuește:

Sb = 7*500 = 3500 lei

Salariul auxiliar(30 % din salariul de bază):

Sb = 3500*0,3 = 1050 lei

Defalcări în Fondul Social (28%):

Cfs = (3500,00 + 1050,00) 0,28 = 1274,00 lei.

Cheltuielile totale pentru achitarea salariului

Ct = 3500,00 + 1050,00 + 1274,00 = 5824,00 lei

Tabelul 2 Durata efectuării lucrărilor.

Programul va fi scris la calculatoare procurate de către întreprindere evaluate la 5 lei pe oră.

Suma cheltuielilor pentru ore-mașină va constitui

Smas = 110,00 * 5 = 550,00 lei.

Cheltuielile pentru procurarea softului necesar. Tabelul 6.

Cheltuilele prețului de cost și prețului de livrare pentru program.

Tabelul 7.

=== l ===

1. Inițiere in Tcl\Tk

1.1 Inițiere

Tcl este un limbaj interpretativ in care totul este sub forma de șiruri de caractere(instrucțiunile,datele,etc..). Limbajul are numai citeva construcții de bază si foarte puțină sintaxă,cea ce-l face usor de invățat.

Tcl dispune de caracteristici ale limbajelor procedurale și are următoarele caracteristici:

Este un limbaj de nivel înalt,de unde reiese mai puțină programare;

Este un limbaj interpretativ(programele scrise în Tcl sunt gata pentru execuție fără compilare,deși există compilator Tcl);

Este un limbaj extensibil (se pot adauga instrucțiuni scrise in Tcl sau C);

Tcl pote fi inclus îi diferite aplicații(interpretatorul Tcl reprezintă o colecție de funcții C care pot fi apelate din codul aplicației);

Tcl poate lucra pe mai multe platforme (Windows,UNIX, Machintosh, etc.). Tcl permite încărcarea bibliotecilor Tcl. Sub Windows se pot încărca bibliotecile dinamice (.DLL).

Execuția umei instrucțiuni poate să avizeze ceva, să calculeze o expresie matematică, să ne afișeze un element grafic.

Sintaxa pentru o comandă este:

command arg1 arg2 arg3 …

Instrucțiunea Tcl poate fi o instrucțiune Tcl, sau o procedură definită de utilizator. Spațiile sunt folosite pentru a separa numele comenzii și argumentele sale, iar new line și punct cu virgulă pentru a separa instrucțiunile.

Caracteristica procesorului de comenzi Tcl are trei etape de bază:

Gruparea argumentelor.

Substituirea rezultatului execuției unei instrucțiuni,variabile sau secvențelor backslash.

Apelarea comenzilor.

Exemplu 1:

puts stdout {Hello World !!!}

>Hello World !!!

Comanda puts are două argumente:

Un canal de intrare/ieșire.

Un șir de caractere de afișat.

De menționat ca argumentele sunt enterpretate de către instrucțiune și că parantezele figurate sunt folosite pentru a grupa cuvintele într-un singur argument.

1.2 Variabilele

Instrucțiunea set este folosită pentru a atribui o valoare unei variabile. Ea are două argumente: variabila si valoarea de atribuit.

Numele variabilei poate fi de orice lungime (care este important) .Pentru denumirea variabilei puteți folosi orice caractere. Interpretorul va crea variabila atunci cînd prima data i se va atribui o valoare ,deci nu este nevoie de a declara variabila. Valoarea variabilei este obținută prefacînd-o cu semnul dolarului.

Exemplu 2:

set var 5

>5

set b $var

>5

A doua instrucțiune atribuie variabilei b valoarea variabilei $var. Semnul dolarului este primul exemplu de substituire. Numele variabilei poate fi de orice lungime, iar case este nesemnificativ (puteți folosi orice caracter pentru a denumi o variabilă). Este permisă si folosirea cuvintelor rezervate. Semnul dolarului nu este altceva decît apelarea instrucțiunii set cu un singur argument și care ca rezultat întoarce valoarea variabilei. Tcl permite includerea variabililor într-un șir de caractere. Implicit interpretorul consideră că numele variabilei constă din caractere alfanumerice și underscore . Șirul $foo.o constă din numele $foo și șirul ‘.o’. Dacă variabila nu este delimitată de spații atunci putem folosi parantezele figurate pentru a delimita numele variabilei ( ${varname} ). Putem folosi metoda dată pentru a delimita variabile cu caractere speciale în numele lor.

Exemplu 3:

set foo filename

set object $foo.o

> filename.o

set a AAA

set b abc${a}def

> abcAAAdef

set .o yuk!

set x ${.o}y

> yuk!y

Noi putem distruge o variabilă cu ajutorul instricțiunii unset :

unset varName varName2 …

Orice număr de variabile poate fi ca parametri pentru unset. Dacă variabila este nedeclarată atunci unset semnalează o eroare.

Existența varabilei poate fi testată cu instrucțiunea info exists .

Exemplu 4:

if {![info exists foobar]} {

set foobar 0

} else {

incr foobar

}

1.3 Substituirea Instrucțiunilor

A doua formă de substituire este command substitution. O instrucțiune poate fi substituită delimitînd-o cu paranteze pătrate []. Interpretorul tratează secvența de caractere între paranteze pătrate ca instrucțiuni Tcl și substituie secvența de instrucțiuni cu rezultatul interpretării lor.

Exemplu 5:

set len [string length Hello]

>6

Instrucțiunea string length întoarce lungimea șirului și o atribuie variabilei len. Instrucțiunea [string length] este executată prima. Daca sunt mai multe substituiri de comenzi , interpretorul le execută de la stinga la dreapta. Rezultatul executării unei instrucțiuni poate fi folosit ca argument al altei instrucțiuni.

1.4 Expresii matematice

Interpretatorul Tcl nu interpretează expresiile matematice. El doar efectuiază gruparea, subtituțiile si apeluri de comenzi. Pentru a evalua expresiile matematice este folosită instrucțiunea expr. Ea analizează și evaluiază expresiile matematice.

Exemplu 6:

expr 8 / 2

>4

Sintaxa expresiilor matematice în Tcl este la fel ca și în C. Instrucțiunea expr are ca argumente intregi, floatanți si valori boleene. Operatorii logici întorc 0(false) sau 1(true). Intregii pot fi extinși pîna la floatanți. Valorile octale sint reprezentate prin precedarea numărului cu zero(033,044,etc.).

Hexazecimalele sint precedate cu 0x. Există posibilitatea de a include referințe la variabile și substituiri de instrucțiuni în expresii matematice .

Exemplu 7:

set x 7

set len [expr [string length Hello] + $x]

>12

La fel expr suportă o mulțime de funcții matematice.

Exemplu 8:

set pi [expr 2*asin(1.0)]

>3.14163649494

Implimentarea instrucțiunii expr permite conversii între numere și șiruri de caractere. Pentru a eficientiza expr întreaga expresie poate fi în paranteze figurate. Mai jos vom descrie mai amănunțit expresiile matematice.

Expresiile matematice pot include substituiri de instrucțiuni,variabile grupîndu-le cu paranteze figurate. Aceasta se permite din cauza că un argument expr este substituit de două ori: prima dată de către interpretatorul Tcl, iar a doua dată de catre expr. De obicei aceasta nu este o problemă din cauza că valorile matematice nu conțin caractere cu o interpretare specială pentru interpretator. A doua rundă de substituiri este necesară pentru a suporta instrucțiuni ca while sau if care folosesc evaluatorul matematic.

Gruparea expresiilor matematice poate îmbunătăți execuția lor.

Cel mai bine este să grupăm expresiile matematice cu paranteze figurate pentru a-i permite evaluatorului matematic să efectueze substituțiile.

Ex. Este la fel ca si exemplul 6 numai că expresiile sunt grupate de paranteze figurate ceea ce duce la executarea mai rapidă a secvenței de instrucțiuni.

Exemplu 9:

set x 7

set len [expr {[string length Hello] + $x}]

>12

În tabelul de mai jos sunt prezentați cîțiva operatori matematici:

– ~ ! Minus unar, bitwise NOT, logical NOT.

* / % Multiplicativ, divide, restul de la înparțire.

+ – Aditiv, scadere.

<< >> Left shift, right shift.

< > <= >= Comparații: mai mic, mai mare, mai mic sau

egal, mai mare sau egal.

== != Egal, Diferit.

& Bitwise AND.

^ Bitwise XOR.

| Bitwise OR.

&& Logical AND.

|| Logical OR.

x?y:z Dacă x atunci y altfel z.

1.5 Substituiri Backslash

Ultimul tip de substituire efectuat de intrepretor este backslash substitution.

Ele sunt folosite pentru a preveni intrepretarea caracterelor speciale pentru interpretor. De exemplu semnul dolarului precedat de backslash nu mai are interpretare specială pentru interpretor.

Exemplu 10:

set dollar \$foo

> $foo

set x $dollar

> $foo

În ex. și $dollar și $x au aceiași valoare $foo din cauza că backslash-ul a anulat semnificația specială a caracterului dolarului.

Backslash-ul este folosit și pentru a împărți instrucțiuni de lungime mare pe mai multe rînduri, din cauza că newline încheie instrucțiunea. Backslash-ul

În exemplul urmator este necesar, altfel instrucțiunea se va sfîrși după semnul + .

Exemplu 11:

set totalLength [expr [string length $one] + \

[string length $two]]

De menționat două lucruri importante despre prefixarea newline cu backslash:

Dacă noi grupăm un argument după cum este descris în capitolul următor, atunci nu mai este nevoie de a prefixa newline cu backslash din cauza că newline face parte din grup și nu termină instrucțiunea;

Backslash in calitatea de ultim caracter în instrucțiune este convertit în spațiu și toate spațiile din rîndul următor sunt înlocuite de aceasta substituție;

În tabelul de mai jos sunt prezentate cîteva segvențe backslash :

Tabelul 1:

1.6 Gruparea cu paranteze figurate și apostrof dublu

Apostroful dublu și parantezele figurate sunt folosite pentru a grupa cuvintele intr-un singur argument. Diferența intre ele constă in aceea că apostroful dublu permite efectuarea de substituiri in grup , pe cînd parantezele figurate previn acest lucru.

Exemplu 12:

set s Hello

> Hello

puts stdout "The length of $s is [string length $s]."

> The length of Hello is 5.

puts stdout {The length of $s is [string length $s].}

> The length of $s is [string length $s].

În primul exemplu interpretorul efectueaza subtituiri de comenzi si variabile și afișează șirul cu puts cu substituiri. In exemplul al doilea șirul este afișat așa cum este. De fapt gruparea cu paranteze figurate este folosită pentru a preveni substituirile pe mai tîrziu(sau deloc). De notat că parantezele pătrate nu pot grupa expresii. O instrucțiune inclusă in grup face parte din grup.

puts stdout "The length of $s is [string length $s]."

În instrucțiunea de mai sus secvența [string length $s] se consideră că face parte din grup.

1.7 Rezumat la Grupări și Substituiri

Parametrii instrucțiunilor sunt separate prin spații dacă nu sunt grupate cu paranteze figurate sau apostrof dublu.

Gruparea cu paranteze figurate previne substituirile. Interpretorul include toate caracterele între parantezele figurate în grup, inclusiv newlines , semicolons și parantezele pătrate. Parantezele figurate exterioare nu fac parte din grup.

Gruparea cu apostrof dublu permite substituirile. Interpretorul grupează totul pînă la următorul caracter ‘ “ ‘ inclusiv newlines , semicolons . Caracterul ‘ “ ’ poate fi inclus în grup precedîndu-l cu backslash . Apostroful dublu exterior nu face parte din grup.

Deciziile de grupare sunt luate anterior efectuării substituirilor, ceea ce înseamnă că rezultatul substituirii nu influențează gruparea.

Semnul dolarului “ $ ” cauzează substituiri de variabile. Numele variabilei poate fi de orice lungime, și case este nesemnificatv. Dacă variabilele sunt incluse într-un șir de caractere sau numele include caractere diferite de caractere alfanumerice atunci numele se distinge cu paranteze figurate ( ${varname} ).

Parantezele patrate cauzează substituiri de instucțiuni. Orice între [] este tratat ca o instrucțiune și este substituit cu rezulatul execuției ei. Includerile sunt permise.

Caracterul backslash “ \ “ pentru a anula interpetarea caracterilor speciale. Este asemănător cu substituirea caracterului special precedat de backslash cu caracterul respectiv.

2. Proceduri Tcl

Tcl folosește instrucțiunea proc pentru a defini o procedură, care după definire poate fi folosită ca oricare altă instrucțiune.

Sintaxa pentru a defini o procedură este:

proc name arglist body

Primul parametru este numele procedurii. Parametrul al doilea este lista de parametri formali. Al treilea parametru este corpul procedurii format din comenzi Tcl. Numele procedurii este case senzitive, si poate conține orce caractere.Numele procedurilor și a variabililor nu conflictează între ele și deci pot fi aceleași. O dată definită o procedură Tcl poate fi apelată ca orișicare altă instrucțiune Tcl. Cînd ea este apelată ,fiecare argument este atribuit parametrului corespunzator și corpul procedurii este executat.

Ca rezultat procedura întoarce rezultatul evaluării ultimei instrucțiuni din corpul procedurii. Instrucțiunea return poate fi folosita pentru a întoarce o valoare anume. Lista de parametri poate conține valori implicite.Asta permite la apelarea procedurii de a omite unele argumente.

Exemplu 13:

proc p1 {a {b 7} {c -2} } {

expr $a / $b + $c

}

p2 6 3

>0

Procedura proc poate fi apelată cu unu ,două sau trei argumente. Valoare implicită pentru b este 7 iar pentru c este –2.

O procedură poate avea un număr variabil de argumente folosind cuvîntul rezervat args ca ultim parametru. Cînd procedura este apelată parametrul args este o listă care conține restul argumentelor.

Exemplu 14:

proc argtest {a {b foo} args} {

foreach param {a b args} {

puts stdout “\t$param = [set $param]”

}

}

argtest 1

> a = 1

b = foo

args =

argtest 1 2

> a = 1

b = 2

args =

argtest 1 2 3

> a = 1

b = 2

args = 3

argtest 1 2 3 4

> a = 1

b = 2

args = 3 4

2.1 Domenii

Există un singur domeniu de definiție pentru nume de proceduri. Noi putem defini o procedură în corpul altei proceduri și această procedură va fi vizibilă oriunde în program. Orice procedură are domeniul de definiție global. Există diferite name space pentru variabile și proceduri, în așa fel pot exista o procedură și o variabilă cu același nume și conflicte nu vor apărea. Fiecare procedură are un domeniu local pentru variabile. Aceste variabile au durata de viață pe parcursul apelului procedurii. După ce procedura este executată, variabilele respective sunt nedefinite. Variabilile definite în afara unei proceduri nu sunt vizibile în corpul procedurii dacă nu sunt folosite instrucțiunile upvar și global. O variabilă globală nu afectează o variabilă locală cu același nume care se află în corpul unei proceduri.

Exemplu 15:

set a 5

set b -8

proc p1 {a} {

set b 42

if {$a < 0} {

return $b

} else {

return $a

}

}

p1 $b

> 42

p1 [expr $a*2]

> 10

Nu există conflicte între variabilile a și b globale și variabilile a și b .

2.2 Instrucțiunea Global

Domeniul cel mai exterior se numește domeniul global.Acest domeniu este în afara corpului oricărei proceduri. Variabilele definite global pot fi facute accesibile în corpul unei proceduri folosind instrucțiunea global.

Sintaxa acestei instrucțiuni este următoarea:

global varname1 varname2 …

Odată variabila facută accesibilă cu global ea este utilizată la fel ca orișicare altă variabilă. Nu este obligatoriu ca variabila să fie în prealabil declarată la nivel global.Cînd variabila este declarată ea devine vizibilă global.

Un lucru util este colectarea tuturor variabilelor globale într-un masiv pentru a opera mai ușor cu declarații globale. Este dificil de a folosi de fiecare dată instrucțiunea global. Folosind masive este nevoe de o singură declarație global. Un alt beneficiu al folosirii masivelor este posibilitate alegerii numelui care reflectă funcțiile procedurilor care utilizează variabilile (module în alte limbaje).

Exemplul de mai jos generează numere aliatorii:

Exemplu 16:

proc randomInit { seed } {

global rand

set rand(ia) 9301 ;# Multiplier

set rand(ic) 49297 ;# Constant

set rand(im) 233280;# Divisor

set rand(seed) $seed;# Last result

}

proc random {} {

global rand

set rand(seed) \

[expr ($rand(seed)*$rand(ia) + $rand(ic)) % $rand(im)]

return [expr $rand(seed)/double($rand(im))]

}

proc randomRange { range } {

expr int([random]*$range)

}

randomInit [pid]

> 5049

random

> 0.517687

random

> 0.217177

randomRange 100

> 17

2.3 Folosirea masivelor pentru declarații globale

Masivele Tcl sunt foarte flexibele din cauza lipsei de restricții la valorile pe care le pot lua indexurile. O utilizare bună pentru masive este pentru a aduna la un loc un set de variabile comune. Un avantaj al folosirii masivelor este aceea că instrucțiunea global are efect asupra întregului masiv, ceea ce simplifică manipulaea variabililor globale.

Spre exemplu, într-o aplicație Tk fiecare modul ale implimentarii poate necesita cîteva variabile globale. Reunindu-le împreună într-un masiv cu nume la fel ca și numele modulului, evităm conflicte între module. Deci pentru orice procedură din modul este de ajuns o singură declarație global pentru a face toate variabilile vizibile.

Exemplul următor folosește un masiv pentru a urmări locația unor obiecte imaginare.

Exemplu 17:

proc ObjInit { o x y } {

global obj

set obj($o,x) $x

set obj($o,y) $y

set obj($o,dist) [expr sqrt($x * $x + $y * $y)]

}

proc ObjMove { o dx dy } {

global obj

if ![info exists obj($o,x)] {

error "Object $o not initialized"

}

incr obj($o,x) $dx

incr obj($o,y) $dy

set obj($o,dist) [expr sqrt($obj($o,x) * $obj($o,x) + \

$obj($o,y) * $obj($o,y))]

}

2.4 Instrucțiunea upvar

Instrucțiunea upvar este folosită pentru a transmite numele variabilei în corpul procedurii în loculul valorii ei(Este similar cu transmiterea parametrilor după referință ca în C). upvar întoarce carezultat o referință către variabila cu numele dat. De obicei procedeul este folosit pentru variabile de tip masiv. Instrucțiunea upvar asociază o variabilă locală cu o variabilă care este situată mai sus în stiva de apel Tcl.

Sintaxa acestei instrucțiuni este următoarea:

upvar ?level? varName localVar ?varName localVar?

upvar face ca una sau mai multe variabile locale în procedura curentă să refere o variabilă sau mai multe din procedura apelantă sau să refere o variabilă globală.

Parametrul level este oțional și are valoarea implicită 1, ceea ce înseamnă un nivel mai sus în stiva de apel Tcl. Puteți specifica orice valoare pentru a urca în stiva de apel Tcl sau puteți specifica o valoare absolută cu sintaxa #number.

Nivelul #0 este nivelul global, de instricțiunea global foo este echivalentă cu:

upvar #0 $VarName foo

Variabila declarată poate fi orice tip de variabilă simplă, un element din masiv sau un masiv. În primele două cazuri variabila este tratată ca un scalar. Iar în cazul trei ca un masiv. Exemplul următor utilizează upvar pentru a afișa valoarea unei variabile scalare după numele ei.

Exemplu 18:

proc PrintByName { varName } {

upvar $varName var

puts stdout “$varName = $var”

}

upvar poate fi utilizat pentru a crea o procedură incr. Tcl incr semnaleză o eroare dacă variabila nu există. Exemplul de mai jos creăm o versiune proprie incr.

Exemplu 19:

proc incr { varName {amount 1}} {

upvar $varName var

if [info exists var] {

set var [expr $var + $amount]

} else {

set var $amount

}

return $var

}

Instrucțiunea upvar este flosită și pentru variabile de tip masiv. Putem transmite ca parametru un nume de variabilă masiv într-o procedură și pe

urmă să folosim instrucțiunea upvar pentru a referi acest masiv.

Exemplu 20:

proc Push { stack value } {

upvar $stack S

if ![info exists S(top)] {

set S(top) 0

}

set S($S(top)) $value

incr S(top)

}

proc Pop { stack } {

upvar $stack S

if ![info exists S(top)] {

return {}

}

if {$S(top) == 0} {

return {}

} else {

incr S(top) -1

set x $S($S(top))

unset S($S(top))

return Sx

}

}

Pentru a recapitula cele expuse mai sus vom prezenta două exemple a calculării factorialului: unul iterativ și altul recursiv.

Exemplu 21:

proc Factorial_Iterativ {x} {

set i 1; set product 1

while {$i <= $x} {

set product [expr $product * $i]

incr i

}

return $product

}

Factorial_Iterativ 10

> 3628800

Exemplu 22:

proc Factorial_Recursiv {x} {

if {$x <= 1} {

return 1

} else {

return [expr $x * [Factorial_Recursiv [expr $x – 1]]]

}

}

Factorial_Recursiv 10

> 3628800

3. Comentarii

Tcl folosește caracterul “ # ” pentru comentarii. Spre deosebire de alte limbaje de programare caracterul “ # ” trebue să fie la începutul instrucțiunii. Dacă “ # ” apare oriunde în altă parte el nu are o interperetare specială. Pentru a avea posibilitatea de a adăuga un comentariu la sfîrșitul instrucțiunii semnul comentariului trebuie precedat de punct cu virgulă “ ; ” pentru a termina instrucțiunea precedentă.

Exemplu 23:

# Niște parametri

set rate 7.0 ; # Rata dobinzii

set months 60 ; # Terminul de rambursare

Un lucru de remarcat este că backslash continuă comentariul în rîndul următor ale scriptului și în plus semicolon n-are o semnificație specială în comentariu.

Exemplu 24:

# În exemlul dat comentariul începe aici \

era parte a doua ; se termină aici

4. Șiruri de caractere

Șirurile de caractere este tipul de date de baza în Tcl. Pentru manipularea șirurilor de caractere în Tcl există o mulțime de funcții. Compararea string-ului cu o expresie regulata(model) se referă la prelucrarea șirurilor de caractere . Exista doua tipuri de potriviri cu un model, glob matching și simple matching.

Mai jos sunt descrise comenzile Tcl de prelucrare a șirurilor:

string compare str1 str2 Compară șirurile. Returnează 0 daca sunt egale, -1 daca str1 mai mic decit str2, altfel întoarce 1.

string first str1 str2 Returnează indexul in str2 primei apariții a lui str1, sau -1 daca str1 nu este gasit.

string index string index Returnează caracterul de la poziția specificată de index.

string last str1 str2 Returnează indexul în str2 ultimei apariții a lui str1, sau -1 daca str1 nu este găsit.

string length string Returnează numărul de caractere în string.

string match pattern str Returnează 1 daca str se potriveste cu pattern, else 0. Stilul glob este folosit pentru potrivire .

string range str i j Returnează un subșir în str care începe în i pîna la j.

string tolower string Returnează string în cu litere mici.

string toupper string Returnează string în cu litere mari.

Am prezentat doar citeva din comenzile pentru manipulare a șirurilor.

5. Potrivire cu un Șablon

Expresiile regulate sunt o posibilitate de a descrie șabloane de string-uri .

Ele implimentează o metodă puternică și compactă de a specifica modele de date. Dacă scriptul nostru efectuează lucru enorm cu șiruri de caractere atunci merită efortul de a studia capitoul respectiv. Scriptul nostru va fi compact și eficient. Regular expression substitution este un mecanism puternic de lucru cu șiruri de caractere și potrivire cu un șablon. Instrucșiunea regsub este la fel folosită pentru procesarea șirurilor de caractere.

Expresiile regulate par complexe la prima vedere. Ele ua proprile reguli și propria sintaxă. Putem fi tentaiă să folosim instrucșiuni ca string first, string range, sau string match pentru a prelucra șirurile de caractere. Dar o singură instrucțiune care folosește expresiile regulate poate înlocui o secvență de instrucțiuni string, ceea ce duce la performațe importante ale programului. De menșionat că regular expression matcher este implementat în C și deci este foarte rapid în execușie.Regular expression matcher face mai mult decît să caute pentru o potrivire. El ne mai arată care parte din string se potrivește cu modelul nostru.Instrucțiunea regexp ușurează acest lucru.

Regular expression matcher este structurat astfel că modelele întîi sunt compilate într-o formă, în care este mai eficientă de potrivit. Dacă folosim des acest model, atunci faza costisitoare de compilare este efectuată o singură dată. Dacă folosim modelul de mai multe ori, atunci interpretorul va apela forma compilată a modelului.

Un lucru important de remarcat, este că segvențele de expresii regulate folosesc aceleași caractere speciale ca și Tcl. Un model care conține paranteze patrate “ [ ] “, semnul dolarului “ $ “, sau spații trebue precedat cu backslash cînd este folosit în instrucțiuni.

5.1 Expresii Regulate

Subcapitolul dat descrie șabloane a expresiilor regulate.

O expresie este o secvență de elemente:

Un caracter literal.

Caracterul de potrivit,set de caractere sau clasă de caractere.

Coantificatori de repetiție.

Caracterul de alternanță.

Subșablaone grupate cu paranteze.

5.2 Caractere de potrivire

Majoritatea caracterelor se autopotrivesc. Modelul de mai jos potrivește un a pe urmă un b:

ab

Caracterul “.” se potrivește cu orice caracter. Spre exemplul modelul următor se potrivește un a urmat de orice alt caracter:

a.

De notat că potrivirea poate avea loc oriunde în string . Caracterul potrivit poate fi strict dintr-un set de caractere cu sintaxa [xyz]. Oricare caracter dintre parantezele patrate poate fi potrivit. Spre exemplu Hello și hello se potrivesc cu modelul:

[Hh]ello

Setul de caractere poate fi specificat ca un domeniu de caractere cu sintaxa [x-z] pentru litere și [0-9] pentru cifre. Exsistă posibilitate complimentarii unui set de caractere, deci caracterul potrivit poate fi orce caracter exceptînd acelea din set ( [^xyz] ). Domeniile și complimentările pot fi combinate. Modelul urmator se potrivește cu orce exceptînd literele mari și mici:

[^a-zA-Z]

Pentru include “]” în setul nostru îl punem imediat după paranteza “[”. Pentru a include “[” nu trebue de întreprins nimic special.Secvența dată potrivește orice paranteze pătrate sau figurate:

[ ] [ { } ]

Majoritatea caracterilor sintaxă pentru expresiile regulate nu mai au semnificație specială intr-un set de caractere. Ceea ce înseamnă că nu mai este nevoe ca să precedăm caracterele speciale cu backslash . Modelul de mai jos potrivește caracterele sintaxă folosite de regular expression:

[] [+*?( )| \ \]

Repetarea unor caractere (cuantificatorii) este specificată cu ajutorul caracterilor “ * ”(zero sau mai multe), “ + ”(unu sau mai multe), “ ? “(zero sau unu).

Coantificatorii pot fi aplicați asupra unui caracter, set de caractere, sau subșabloane grupat de paranteze. Următorul model potrivește un b urmat de zero sau mai mulți a:

ba*

Putem grupa o parte din model cu paranteze și să aplicăm un coantificator pentu partea aceea. Următorul model potrivește un șir format din una sau mai multe secvențe ab:

(ab)+

Modelul care potrivește orice inclusiv un șir vid are forma:

.*

Coantificatorii sunt “lacomi”(greedy): “Lăcomia” se manifestă prin aceea că ele potrivesc un număr nedeterminat de caractere. Expresiile regulate avansate restricții asupra acestei caracteristici.

Alternanța ne permit să testăm mai mult de o potrivire concomitent. Regular expression matcher este capabil să testeze paralel mai multe modele, deci alternarea este foarte eficientă. Alternanța este posibilă cu ajutorul caracterului “ | ”. Pentru a potrivi Hello sau hello:

Hello|hello

O alternativă a modelului de mai sus este:

(H|h)ello

Sau:

[Hh]ello

Implicit modelul nu potrivește întregul cuvînt. Pot fi caractere nepotrivite după sau înaintea potrivirii. Noi putem fixa potrivirea la începutul cuvîntului precedînd modelul cu “ ^ ”, sau la sfîrșitul lui încheind modelul cu “ $ ”. Noi putem forța modelul să potrivescă întregul cuvînt folosind ambele caractere.

Toate șirurile care sunt delimitate de spații se potrivesc cu:

^[ \ t]+

Dacă avem mai multe rînduri de text la întrare, putem crede despre “ ^ ” însemnînd “început de rînd” în loc de “început de șir”. Implicit “ ^ ”și” $ ” se referă începutul textului de la întrare și newlines sunt ignorate.

Pentru a preveni interpetarea specială a “. * ? + [ ] ( ) ^ $ | \” ele trebue precedate cu backslash . Spre exemplu: \+.

Dacă modelul poate potrivi mai multe parți din șir, atunci rezulatul este prima potrivire din șir. Dacă există alternative de potrivire în model atunci rezultatul este cea mai lungă potrivire. Parantezele “ () ”sunt folosite pentru a capta subomodele. Șirul care se potrivește cu modelul este memorat înt-o variabilă specială. Spre exemplu:

Hello World, Hello!!!

este echivalent cu:

(Hello) World, \1!!!

Tcl are două comenzi regexp si subreg. Prima este folosită pentru a verifica potrivirea șirului cu un model și are sintaxa:

regexp ?flags? pattern string ?matchVar subMatchVar1 subMatch2…?

Returnează valoarea 1 daca pattern si string se potrivesc și 0 invers. Dacă alți parametri sunt specificați după string, atunci parametrii respectivi sunt tratați ca nume de variabile, în care sunt plasate informațiile despre partea din string care se potrivește exp. matchVar i se va atribui partea din string care se potrivește cu exp. Variabilelor rămase li se atribuie subșiruri din string care se potrivesc cu submodele incluse în paranteze “ ( ) ”din pattern. Exemplul următor ne demonstrează facilitățile acestei instrucțiuni.

Exemplu 25:

proc URL {} {

set url http://www.beedub.com:80001/index.html

regexp {([^:]+)://([^:/]+)(:([0-9]+))?(/.*)} $url match protocol server port num path

> 1

puts $match

> http://www.beedub.com:80/index.html

puts $protocol

> http

puts $server

> www.beedub.com

puts $port

> :80

puts $num

> 80

puts $path

> /index.html}

subreg este folosit pentru a inlocui toate subșirurile dintr-un sir, care se potrivesc cu un model. regsub are urmatoarea sintaxa:

regsub ?switches? pattern string subSpec varName

Orce string care se potrivește cu pattern este inlocuit cu subSpec, ear string este atribuit lui VarName.Dacă subSpec conține “ & ” sau “\0” atinci caracterul este înlocuit cu o parte din string care se potrivește cu exp.Dacă subSpec conține “ \n ” unde n este o cifră între 1 și 9, atunci numărul este înlocuit cu cu o parte din string care se potrivește cu a n-lea subexp luată între paranteze din exp. Returnează numărul de potriviri înlocuite sau 0 in caz contrar.

Exemplu 26:

proc Cgi_List {} {

set query [Cgi_Query]

regsub -all {\+} $query { } query

set result {}

foreach {x} [split $query &=] {

lappend result [Url_Decode $x]

}

return $result

}

proc Cgi_Query {} {

global env

if {![info exists env(QUERY_STRING)] ||

[string length $env(QUERY_STRING)] == 0} {

if {[info exists env(CONTENT_LENGTH)] &&

[string length $env(CONTENT_LENGTH)] != 0} {

set query [read stdin $env(CONTENT_LENGTH)]

} else {

gets stdin query

}

set env(QUERY_STRING) $query

set env(CONTENT_LENGTH) 0

}

return $env(QUERY_STRING)

}

Exemplul de mai sus pentru a decodifica datale care sunt parvenite de la o formă HTML.

În tabelul de mai jos sintaxa de bază pentru expresiile regulate:

Tabelul 2:

În tabelul de mai jos sintaxa de bază pentru expresiile regulate avansate

6. Structuri de date Tcl

Tipul de bază in Tcl sunt șirurile de caractere (stringuri). În plus la stringuri ]n Tcl mai sunt două tipuri de structuri: liste si masive de elemente. Listele sint implimentate în formă de stringuri. Structura lor este asemănătoare cu structura stringurilor șirurilor. Regulile sintactice sunt la fel ca și pentru instrucțiuni și în fond instrucțiunile, sunt un caz particular de liste. Masivele sunt variabile indexate, unde indexul este un string. Listele sunt eficiente cînd au un număr limitat de elemente. Masivele sunt bune cînd este vorba de colecții mari de elemente.

6.1 Listele

Spre deosebire alte limbaje in Tcl listele sunt stringuri cu o interperetare specială. Listele in Tcl au aceeasi sintaxa, ca și instrucțiunile Tcl. Deci o listă este un string, în care elementele sunt separate prin spații. Caracterele

“ { }” și ‘ ” ” ’ sunt folosite pentru a grupa cuvintele într-o listă.

O listă poate fi creată cu ajutorul instrucțiunii list:

list arg1 arg2 …

Dacă un parametru are caractere cu interpretare specială, atunci ne folosim de backslash.

Exemplu 27:

set x {1 2}

> 1 2

set y foo

> foo

set l1 [list $x "a b" $y]

> {1 2} {a b} foo

set l2 "\{$x\} {a b} $y"

> {1 2} {a b} foo

Un lucru de remarcat este că “{ }” care sunt folosite pentru grupa elementele listei într-o singur parametru al instrucțiunii set, nu fac parte din din listă.

Instrucțiunea lappend este folosită pentru a adăuga cîteva elemente la sfirșitul unei liste:

Exemplu 28:

lappend new 1 2

> 1 2

lappend new 3 "4 5"

> 1 2 3 {4 5}

set new

> 1 2 3 {4 5}

Comanda concat concatenează elementele sau listele date ca parametri într-o singură listă.

Exemplu 29:

conacat 1 {2 3} {4 5 6}

>1 2 3 4 5 6

In Tcl mai sunt și alte comenzi de manipulare a listelor.

6.2 Tablouri de elemente

Un element din masiv este o variabila cu un index în paranteze, care este un string. Intern un masiv este implementat în forma de hashtable și deci viteza de acces al elementelor este aceiași.Indexul poate avea orice valoare inclusiv poate fi o substituire .

Un element se crează cu comanda set in felul următor:

set arr(index) Hello

Iar valoarea poate fi obținută:

set arr(index)

>Hello

Urmatorul exemplu crează un masiv de elemente:

Exemplu 30:

set arr(0) 1

for {set i 1} {$i <= 10} {incr i} {

set arr($i) [expr $i * $arr([expr $i-1])]

}

Tcl are multe comenzi pentru manipulare a masivelor.

7. Comenzi de control a execuției programului

Ca și alte limbaje de programare Tcl are structuri de control a execuției programului. Pentru efectuarea repetării unui set de comenzi sunt instrucțiuni ca: while,for,foreach. Pentru ramificari: if și switch.

Pentru tratarea erorilor:catch. Și break,continue,error,return pentru a ieși din bucle.

Comenzi ca if,while,for necesita expresii booleene. Intern ele folosesc comanda expr pentru a testa expresia booleana.

if … then … else este ca și în alte limbaje și are următoarea sintaxa:

if boolean then body1 else body2

Dacă boolean este true atunci se execută body1 altfel body2.

Exemplu 31:

if($x==0) {

puts stderr “Impartire la zero”}

else {set slope [expr $y/$x] }

Pentru ramificări mai poate fi folosit elseif:

if {$key < 0} {

incr range 1

} elseif {$key == 0} {

return $range

} else {

incr range -1

}

Există și alte comenzi de control a execuției a programului.

8. Evaluatorul Tcl

Evaluarea dinamică face Tcl flexibil și dinamic. Ideea de bază constă în crearea unui string și evaluarea lui cu instrucțiunea eval pentru a interpreta acel string ca o instrucțiune sau o secvență de instrucțiuni. Crearea unui program dinamic este foarte ușoară cu limbaje interpretative ca Tcl, și foarte dificilă sau imposibilă cu limbaje compilative ca C++ sau C.

Sunt cîteva posibilități de folosire a evaluării dinamice:

În unele cazuri o procedură simplă nu este eficientă în deajuns, dar noi avem nevoie de o instrucțiune formată din cîteva părți diferite, și să o execută cu eval.

Callbacks sunt fragmente de script care sunt păstrate și evaluate mai tîrziu ca răspuns la producerea unui eveniment. Ca exemple ne pot servi instrucțiuni asociate cu elemente grafice Tk, instrucțiunea I/O fileevent și instrucțiunea after. Callbacks este o metodă flexibilă de a lega diferite părți al unei aplicații împreună.

Cu ajutorul evaluării dinamice și instrucțiunii uplevel putem crea noi structuri de control a execuției programului. Spre exemplu putem scrie o funcție care aplică o instrucțiune la fiecare rînd dintr-un fișier.

Putem combina cod de program și date și codul să-l procesăm cu ajutorul instrucțiunii subst.

8.1 Crearea codului cu ajutorul list

Poate fi dificilă crearea unei instrucțiuni în așa ca ea să fie evaluată corect de eval. Aceleași dificultați apar și la instrucțiunile after, uplevel, send, toate au aceleeași proprietăți ca și eval. Construirea dinamică a instrucțiunilor este sursa multor probleme. Principala problemă este că programul într-un caz poate lucra, dar poate aduce la erori de execuție în altul.

Pentru a construi instrucțiuni dinamice, e de preferat să folosim instrucțiunile list, concat, lappend, luînd în considerație că instrucțiunile sunt un caz particular a listelor Tcl.

8.2 Instrucțiunea eval

Instrucțiunea eval constă în invocarea interpretorului Tcl. Dacă construim un program dinamic, trebue să folosim eval pentru interpretarea lui. Spre exemplu, noi vrem să construim instrucțiunea de mai jos acum, dar să o executăm mai tîziu:

puts stdout “ Hello, World !!! ”

În acest caz este de ajuns să scriem:

set cmd {puts stdout "Hello, World!"}

> puts stdout "Hello, World!"

# mai tîrziu …

eval $cmd

> Hello, World!

În acest exemplu valoarea cmd este transmisă interpretorullui Tcl. Toate grupările și substituirile sunt executate la evaloare.

Să presupunem că o parte din instrucțiune este păstrată într-o variabilă,și variabila dată nu este definită cînd eval este invocată. Segvența de mai jos ilustrează acest caz:

Exemplu 32:

set string "Hello, World!"

set cmd {puts stdout $string}

> puts stdout $string

unset string

eval $cmd

>can’t read "string": no such variable

În acest exemplu instrucțiunea conține $string. Cînd $string este procesat de catre eval , interpretorul caută valoarea actuală $string, care este nedifinită.

O greșeală mare este folosirea ‘ ” ” ’ pentru a grupa instrucțiunea. Lucrul acesta va substitui imediat valoarea din $string. Acest lucru este posibil dacă $string are o valoare simplă. Dacă $string conține spații sau caractere speciale, se va produce o eroare de execuție:

Exemplu 33:

set cmd "puts stdout $string"

> puts stdout Hello, World!

eval $cmd

> bad argument "World!": should be "nonewline"

O soluție la acestă problemă este folosirea instrucțiunii list, ca în exemplul următor:

Exemplu 34:

set string "Hello, World!"

set cmd [list puts stdout $string]

> puts stdout {Hello, World!}

unset string

eval $cmd

> Hello, World!

Efectul este că list crează o listă conținînd trei elemente: puts, stdout, și valoarea lui string. Substituirea lui $string este efectuată înainte invocării list și list are grijă de gruparea valorii. Folosirea ‘ ” ” ’ este echivalentă cu:

set cmd [concat puts stdout $string]

Problema este că concat nu păstrează structura listei. Concluzia principală este că, trebuie să folosim instrucțiunea list pentru construirea de instrucțiuni, dacă ele conțin variabile rezultatele execuției de instrucțiuni, care sunt substituite instantaneu. Dacă folosim ‘ ” ” ’, atunci se produc substituiri,dar se pierde structura instrucțiunii.

8.3 Instrucțiuni care concatanează

Instrucțiunile uplevel, after, send concatanează parametrii lor într-o singură instrucțiune pentru a o executa mai tîrziu într-un alt context. Cînd folosim instrucțiunile date, este de preferat să folosim list pentru a evita concatanarea argumentelor:

after 100 [list doCmd $param1 $param2]

send $interp [list doCmd $param1 $param2];#Safe!

Exemplele de mai sus lucrează întotdeauna. Iar următoarele numai dacă param1 și param2 ca valori au un singur element din listă:

after 100 doCmd $param1 $param2

send $interp doCmd $param1 $param2;# Unsafe!

9. Instrucțuni Callbacks

9.1 Instrucțiunea after

after este folosită pentru a amîna execuția programului sau execuția lui pe fundal mai tîrziu. Sintaxa este următoarea:

after ms

after ms ?script script script …?

after cancel id

after cancel script script script …

after idle ?script script script …?

after info ?id

Ea are cîteva forme în dependență de primul parametru:

after ms

ms trebuie să fie un întreg însemnînd timpul în milisecunde. Execuția instrucțiunii este blocată pe ms milisecunde după care execuția continuă. Pe durata blocării aplicația nu răspunde la evenimente.

after ms ?script script script …?

În forma dată after este executată instantaneu. Concataneză(similar instrucțiunii concat) parametrii script într-o instrucțiune și o execută ms milisecunde mai tîrziu. Instrucțiunea este executată la nivel global (în afara orcărei porceduri Tcl) o singură dată. after întoarce ca rezultat un identificator care poate fi folosit pentru a anula instrucțiunea blocată cu after cancel.

after cancel id.

Anulează execuția instrucțiunii blocate. id indică care instrucțiune urmează să fie anulată(id trebue să fie întors de către after ms ?script script script …?).Dacă instrucțiunea id a fost deja executată atunci after cancel id n-are efect.

after idle script ?script script …?

Concatanează parametrii script cu spații între ei (la fel ca și concat) și face ca instrucțiunea rezultată să fie evaluată mai tîrziu ca pe fundalul execuției aplicației (idle callback). after idle întoarce ca rezultat un identificator care poate fi folosit pentru a anula instrucțiunea blocată cu after cancel.

9.2 Instrucțiunea fileevent

Sintaxa:

fileevent channelId readable ?script?

fileevent channelId writable ?script?

Acestă instrucțiune este folosită pentru a crea prelucrători care prelucrează evenimentele parvenite de la operațiile de I/O(file event handlers). Un astfel de prelucrător este legătura între canal I/O și un script. script este evaluat de fiecare dată cînd se produce o operație de I/O. Spre exemplu, noi putem descide un pipeline pentru citire, și pe urmă să procesăm datele citite din pipeline folosind prelucrătorul din script. Principalul avantaj constă în aceea că aplicația noastră poate pote face și alte lucruri cum ar fi, redesenarea interfeței grafice, după primirea unor date noi. Prelucrătorul folosește instrucțiuni Tcl pentru a citi sua scrie untr-un canal I/O. Spre exemplu dacă canalul generează rînduri de date atunci putem folosi gets pentru a citi un rînd. Dacă citim mai multe date decît sunt disponibile atunci aplicația noastră se va bloca pînă nu va primi date la întare. Ar trebui în prelucrător să verificăm end-of-file pentru al invoca cînd se produce evenimentul

end-of-file. Este mai sigur de a închide canalul în corpul prelucrătorului, pentru că înciderea canalului automat distruge prelucrătorul. Putem crea cîte un prelucrător pentru operațiile de întrare și ieșire.

channelId se referă la un canal descis, ca cel returnat deinstrucțiunea open sau socket. Dacă parametrul script este specificat atinci fileevent crează un nou prelucrător. script va fi evaluat de fiecare dată cînd apare o operație de I/O.Opțiunea readable este folosită pentru citire ear writable pentru scriere.

În cazul dat fileevent returnează un string null. Prelucrătorii readable și writable pentru un canal sunt independenți și deci pot fi creți și distruși independent. Desigur pot exista mai mulți prelucrători readable și writable pentru un canal în același tip și pentru aclelași interpretor. Dacă fileevent este invocată cînd prelucrătorul specificat există deja, prelucrătorul nou îl înlocuește pe cel vechi.Dacă parametrul script nu este specificat atunci fileevent returnează scriptul curent pentru chennelId sau un string null. Dacă script este specificat ca un string null, atunci prelucrătorul este distrus. Prelucrătorul pentru un canal este automat distrus atunci cînd canalul este încis.Exemplul de mai jos ilustrează cele expuse mai sus:

Exemplu 34:

set pipe [open "|some command"]

fileevent $pipe readable [list Reader $pipe]

proc Reader { pipe } {

if [eof $pipe] {

catch {close $pipe}

return

}

gets $pipe line

# Process one line

}

9.3 Instrucțiunea Send

send ?options? app cmd ?arg arg …?

Instrucțiunea send ca cmd(și args) să fie executată înr-o aplicație cu numele app. Ea returnează rezultatul aplicației sau o eroare de execuție (dacă există). App poate fi numele a orcărei aplicații a cărei fereastră principală este afișată și care conține fereastra principală a exepeditorului,nu este neceasar ca ele să fie în același proces. Dacă parametrii arg nu sunt prezenți atunci instrucțiunea de executat este conținută internal cu parametrii din cmd. Dacă unu sau mai mulți arg sunt prezenți, atunci ei sunt concatenați într-o formă de executat, asemănător ca pentru eval. O aplicație își definește numele după ce șîi crează fereastra principală .

Să prezentăm cele expuse mai sus cu un exemplu. Scriptul de mai jos, citește datele de la întrare și le readrisează unei alte aplicații. Noi putem plasa segvența de mai jos după crearea unui pipeline pentru a obține un loopback pentru aplicația principală, dar putem folosi fileevent pentru a obține un efect similar. Un avantaj al filosirii send cu fileevent este că expeditorul și receptorul sunt mai independeți. Mai jos este preuzentat expeditorul:

Exemplu 35:

#!/usr/local/bin/wish

# exepeditorul are pînă la 4 argumente:

# 1) Numele aplicației cărei trubue de expediat.

# 2) prefixul instrucțiunii

# 3)numele aplicației care trebue anunțată

# după terminarea datelor.

# 4) instrucțiunea de folosit la anunțare.

# Ascunde fereastra care nu ne trebue

wm withdraw .

# Procesează parametrii linie de comandă

if {$argc == 0} {

puts stderr "Usage: send name ?cmd? ?uiName?"

exit 1

} else {

set app [lindex $argv 0]

}

if {$argc > 1} {

set cmd [lindex $argv 1]

} else {

set cmd Send_Insert

}

if {$argc > 2} {

set ui [lindex $argv 2]

set uiCmd Send_Done

}

if {$argc > 3} {

set uiCmd [lindex $argv 3]

}

# Citește datele de întrare și le readresează lui logger

while {! [eof stdin]} {

set numBytes [gets stdin input]

if {$numBytes < 0} {

break

}

# Ignoră erorile lui logger

catch {send $app [concat $cmd [list $input\n]]}

}

# Anunță controlerul dacă există

if [info exists ui] {

if [catch {send $ui $uiCmd} msg] {

puts stderr "send.tcl could not notify $ui\n$msg"

}

}

# Forțează terminarea aplicației.

exit

10. Descrierea Programului

Programul începe cu declarerea valorilor globale implicite pentru afișarea și înserarea textului:

set textedit(text_fore) black

set textedit(text_back) white

set textedit(intf_fore) black

set textedit(intf_back) lightsteelblue

După care instrucțiunea care dă un nume implicit fișierului editat(Numele este Untitled).

Procedura file_read citește dintr-un fișier și ca parametru are filename, numele fișierului de citit. Procedura file_write este folosită pentru a scrie într-un fișier și are ca parametri filename și data, numele fișierului și datele de scris în fișier respectiv. Procedura file_load încarcă fișierul în fereastra de editare, parametrii filename, toplevel,textwidget sunt folosiți pentru numele fișierului, fereastra din topul erarhiei și elementul grafic pentru afișarea textului respectiv. New_file este folosită pentru a crea un fișier nou și are ca parametri toplevel, textwidget. Title reprezintă titlul ferestrei noi. Open_file afișează fereastra cu fișiere, unul dintre care urmeză să fie descis (Unul din fișiere cu extensiile .tcl, .txt, *.doc).

open_file folosește funcția Open_file pentru a cere numele fișierului de citit și are 2 parametri toplevel, textwidget, care reprezintă fereastra părinte și elementul grafic textual, respectiv. Insert_file adaugă un text într-un fișier fără a distruge conținutul anterior. Save_file salavează textul care se conține în elementul grafic textual într-un fișier. Parametrul textwidget este elementul grafic textual din care se va salva textul. Save_file_as este folosită pentru a salva un text într-un fișier sub un nume oarecare și are ca parametri toplevel, textwidget. Procedura dată apelează Save_file care afișează fereastra cu numele fișierului în care va fi salvat textul. Procedura cut_text este apelată cînd este nevoe să ștergem un text care a fost în prealabil înserat și ca parametru are textwidget, elementul grafic textual din care trebue de șters textul. Procedura copy_text este folosită pentru a copia un text înserat în prealabil într-un alt loc din elementul grafic textual. Ca parametru are textwidget. Paste_text insertează textul copiat cu copy_text într-un alt loc din elementul grafic textual și are același parametru textwidget. Help_about afișează o fereastră grafică cu informație despre program. Toplevel este fereastra părinte al ferestrei help. Procedura find_text este utilizată pentru a căuta un text anumit dintr-un text dat. Parametrul entrywidget reprezintă elementul grafic în care este introdus textul de căutat, ear textwidget elementul grafic textual în care trebue de căutat textul. Find_text_widget crează elementul grafic pentru căutarea textului. Variabila globală find_last_index este folosită pentru a păstra punctul de unde va fi reluată căutarea următoare a textului.

Asupra procedurii create_textedit ne vom opri mai amănuțit.

În interiorul ei sunt declarate variabilile globale argc, argv, unde argv este o listă . Argc și argv sunt asemănătoare cu variabilele respective din C. Dacă argc este mai mare de 0 atunci instrucțiunea set filename [lindex $argv 0] întoarce primul element din listă, care este numele fișierului de afișat și îl pasează instrucțiunii load_file care încarcă fișierul respectiv.

Segvența de mai jos crează meniul și submeniul File:

menu .menubar -tearoff 0

set men [menu .menubar.file -tearoff 0]

.menubar add cascade -label File -menu $men -underline 0

$men add command -label New -underline 0 \

-command "new_file . $textname Untitled"

$men add command -label "Open…" -underline 0 \

-command "open_file . $textname"

$men add separator

$men add command -label Save -underline 0 \

-command "save_file $textname"

$men add command -label "Save As…" -underline 5 \

-command "save_file_as . $textname"

$men add separator

$men add command -label Exit -underline 1 \

-command {exit}

Ear segvența de mai jos asociază segvențe de program cu evenimente Tcl.

bind . <Control-Key-o> "open_file . $textname;break"

bind . <Control-Key-a> "save_file_as . $textname;break"

Mai jos procedeul se repetă pentru submeniul Edit:

set men [menu .menubar.edit -tearoff 0]

.menubar add cascade -label Edit -menu $men -underline 0

$men add command -label Cut -underline 0 -accelerator Ctrl+X \

-command "cut_text $textname"

$men add command -label Copy -underline 1 -accelerator Ctrl+C \

-command "copy_text $textname"

$men add command -label Past -underline 0 -accelerator Ctrl+V \

-command "paste_text $textname"

Și respectiv legăturile:

bind $frm.text <Control-Key-x> "cut_text $frm.text; break"

bind $frm.text <Control-Key-c> "copy_text $frm.text; break"

bind $frm.text <Control-Key-v> "paste_text $frm.text; break"

Același procedeu se repetă pentru submeniul Search și Help.

11. Listingul Programului

set textedit(text_fore) black

set textedit(text_back) white

set textedit(intf_fore) black

set textedit(intf_back) lightsteelblue

set textedit(last_directory) [pwd]

set textedit(save_name) "Untitled.txt"

global textedit

proc read_file { filename } {

set data ""

if { [file readable $filename] } {

set fd [open $filename "r"]

set data [read $fd]

close $fd

}

return $data

}

proc write_file { filename data } {

return [catch {

set fileid [open $filename "w"]

puts -nonewline $fileid $data

close $fileid

}]

}

proc load_file { toplevel textwidget filename } {

set data [read_file $filename]

if { $data != "" } {

new_file $toplevel $textwidget $filename

$textwidget insert end $data

}

}

proc new_file { toplevel textwidget title } {

set names [$textwidget tag names]

foreach tagname $names {

$textwidget tag delete $tagname

}

$textwidget delete 1.0 end

wm title $toplevel $title

focus $textwidget

}

proc Open_file { } {

global textedit

set file_types {

{ "Tcl Files" { .txt } }

{ "Text Files" { .doc } }

{ "All Files" * }

}

set filename [tk_getOpenFile -initialdir \

$textedit(last_directory) \

-filetypes $file_types \

-title "Select a file to load" \

-parent .]

set $textedit(last_directory) [file dirname $filename]

return $filename

}

proc open_file { toplevel textwidget } {

set filename [Open_file]

if { $filename != "" } {

load_file $toplevel $textwidget $filename

focus $textwidget

}

}

proc insert_file { toplevel textwidget } {

set filename [Open_file]

if { $filename != "" } {

set data [read_file $filename]

if { $data != "" } {

$textwidget insert insert $data

focus $textwidget

}

}

}

proc save_file { textwidget } {

global textedit

set data [$textwidget get 1.0 {end -1c}]

set text [string trimright $data]

return [write_file $textedit(save_name) $data]

}

proc Save_file { } {

global textedit

set file_types {

{ "Tcl Files" { .txt } }

{ "Text Files" { .doc } }

{ "All Files" * }

}

set filename [tk_getSaveFile -initialdir \

$textedit(last_directory) \

-filetypes $file_types \

-title "Select file name to save" \

-parent .]

set textedit(last_directory) [file dirname $filename]

return $filename

}

proc save_file_as { toplevel textwidget } {

global textedit

set filename [Save_file]

if { $filename != "" } {

set textedit(save_name) $filename

save_file $textwidget

wm title $toplevel $filename

}

}

global find_last_indx

set find_last_indx 1.0

proc find_text { entrywidget textwidget } {

global find_last_indx

set search_for [$entrywidget get]

set length [string length $search_for]

set indx [$textwidget search – \

$search_for $find_last_indx end]

if { $indx == "" } {

set find_last_indx 1.0

set indx [$textwidget search – \

$search_for $find_last_indx end]

}

if { $indx != ""} {

catch {

$textwidget tag remove sel sel.first sel.last

}

$textwidget tag add sel $indx "$indx + $length chars"

$textwidget mark set insert $indx

$textwidget see $indx

set find_last_indx "$indx + 1 char"

} else {

set find_last_indx 1.0

# puts "$search_for not found"

}

}

proc find_text_widget { textwidget } {

global textedit

toplevel .find

wm transient .find .

set en [entry .find.text]

label .find.what -text "Find what:"

button .find.findnext -text "Find next" \

-command "find_text $en $textwidget"

button .find.cancel -text " Cancel " -command {destroy .find}

pack .find.what .find.text .find.findnext .find.cancel \

-side left -padx 5 -pady 10

bind .find.findnext <Key-n> "find_text $en $textwidget;break"

bind .find.cancel <Key-c> {destroy .find;break}

focus .find.text

}

proc cut_text { textwidget } {

set owner [selection own]

if { $owner == $textwidget } {

clipboard clear

catch {

set text [selection get]

clipboard append $text

$owner delete sel.first sel.last

}

}

}

proc copy_text { textwidget } {

set owner [selection own]

if { $owner == $textwidget } {

clipboard clear

catch {

clipboard append [selection get]

}

}

}

proc paste_text { textwidget } {

catch {

set clip [selection get -selection CLIPBOARD]

}

set idx [$textwidget index insert]

set owner [selection own]

if { $owner == $textwidget } {

catch {

set idx [$owner index sel.first]

$textwidget delete sel.first sel.last

}

}

catch {

$textwidget insert $idx $clip

}

}

proc help_about { toplevel } {

tk_messageBox -default ok -icon info -message \

{Hello World !!!}\

-parent $toplevel -title "About TextEdit" -type ok

}

proc create_textedit { } {

global argc argv

global textedit

set textname .main.text

menu .menubar -tearoff 0

set men [menu .menubar.file -tearoff 0]

.menubar add cascade -label File -menu $men -underline 0

$men add command -label New -underline 0 \

-command "new_file . $textname Untitled"

$men add command -label "Open…" -underline 0 \

-command "open_file . $textname"

$men add command -label "Insert…" -underline 0 \

-command "insert_file . $textname"

$men add separator

$men add command -label Save -underline 0 \

-command "save_file $textname"

$men add command -label "Save As…" -underline 5 \

-command "save_file_as . $textname"

$men add separator

$men add command -label Exit -underline 1 \

-command {exit}

bind . <Control-Key-o> "open_file . $textname;break"

bind . <Control-Key-a> "save_file_as . $textname;break"

set men [menu .menubar.edit -tearoff 0]

.menubar add cascade -label Edit -menu $men -underline 0

$men add command -label Cut -underline 0 -accelerator Ctrl+X \

-command "cut_text $textname"

$men add command -label Copy -underline 1 -accelerator Ctrl+C \

-command "copy_text $textname"

$men add command -label Past -underline 0 -accelerator Ctrl+V \

-command "paste_text $textname"

set men [menu .menubar.search -tearoff 0]

.menubar add cascade -label Search -menu $men -underline 0

$men add command label "Find.." -underline 0 -accelerator Crtl+F \ -command "find_text_widget $textname"

bind . <Control-Key-f> "find_text_widget $textname"

set men [menu .menubar.help -tearoff 0]

.menubar add cascade -label Help -menu $men -underline 0

$men add command -label "About" -underline 0 \

-command "help_about ."

. configure -menu .menubar

set frm .main

frame $frm -bd 4 -relief flat

text $frm.text -width 80 -height 30 -wrap none -bg white \

-yscrollcommand "$frm.vscroll set" \

-xscrollcommand "$frm.hscroll set"

scrollbar $frm.vscroll -command "$frm.text yview"

scrollbar $frm.hscroll -command "$frm.text xview" \

-orient horizontal

pack $frm.vscroll -side right -fill y

pack $frm.hscroll -side bottom -fill x

pack $frm.text -side left -fill both -expand 1

pack $frm -side right -fill both -expand 1

bind $frm.text <Control-Key-x> "cut_text $frm.text; break"

bind $frm.text <Control-Key-c> "copy_text $frm.text; break"

bind $frm.text <Control-Key-v> "paste_text $frm.text; break"

if { $argc > 0 } {

set filename [lindex $argv 0]

load_file . $textname $filename

}

pack $frm -side top -fill both -expand 1

update

focus $textname

}

create_textedit

=== PROT ===

PROTECȚIA MUNCII LA ÎNTREPRINDERE

1.1. Aprecierea pericolului la monitor

Odată cu dezvoltarea tehnicii de calcul tot mai mult se atrage atenția asupra problemelor protecției utilizatorilor, în special acelor care lucrează la calculator, adică langă monitor. Principalii factori dăunători, care influențează asupra sănătații omului, cînd acesta lucrează langă monitor sunt:

radiatia sau iradieri ionizate;

cîmpul electrostatic;

cîmpul electromagnetic, etc.

Iradieri Ionizate reprezinta iradierea electro-magnetică cu o capacitate de ionizare a moleculelor. Dacă se provoacă ionizarea moleculelor organismului uman, atunci legaturile între molecule se distruge și ca rezultat apar diferite boli. Capacitatea de ionizare o au urmatoarele particule: D DX D- iradieri, fluxul de electroni, substantele radioactive.

În cazul monitoarelor cel mai semnificativ tip de iradiere ionizată este r – iradiere, care insa este foarte mică, de obicei nu depașește normele biologice. Celelalte tipuri de iradieri pot fi neglijate deoarece greu pot fi depistate.

D – iradierea apare in urma ciocnirii electronilor cu atomii substantei luminofore sau cu atomii ecranului din sticla.

Pentru a micsora iradierea ionizata a monitoarelor moderne, pe suprafata lor se aplica o foaie metalica stravezie, care atenuează fluxul de iradiere. O altă cale de apărare împotriva iradierii ionizate este procurarea unui ecran protector, care se instaleaza pe monitor si are același efect ca si foaia metalica stravezie.

În genere iradierea ionizata asupra omului poate provoca urmatoarele actiuni:

1) locale – actiuni de scurtă durată cu doze mari, care aduce la traume locale: imbolnavirea pieii, pierderea pieii, pierderea unghiilor, defectarea oaselor, cancer;

2) totale – reprezintă iradieri indelungate cu doze mici, aduce la imbolnavirea sangelui (leucemie).

Campul electrostatic, care apare pe ecranul monitorului este rezultatul bombărdarii permanente a monitorului cu fascicolul de electroni emis de catod. Astfel sarcina electrică, case se acumulează pe suprafata monitorului, formeaza cîmpul electrostatic. Fenomenul electrizarii statice este legat si de starea aerului din mediu, in conditii normale aerul se caracterizează cu proprietăți izolatorii înalte, însă sub acțiunea razelor solare si celor cosmice, radiației materialelor radioactive a scoartei pamîntului si a altor factor ionizatori, moleculele neutrale a aerului se ionizează, formînd ioni pozitivi si negativi – purtatori ai sarcinii electrice. Dacă intensitatea cîmpului electric, format de materialele, de dispozitivele de curent continuu si de obiectele, care usor se electrizeaza, este mare, atunci ionii liberi obtin energie cinetica suficientă pentru a forma ioni noi la ciocnirea lor cu moleculele neutre, in urma ionizarii aerul iși pierde proprietatea sa de izolator (devine conductibil) si descarcarea electrică latentă se transformă intr-o descarcare sferică, adică are loc o strapungere electrică a aerului. Descarcarea electricitatii statice poate provoca o explozie, incendiu si alte accidente. La unele întreprinderi, care produc substanțe sintetice, polimeri și produse din aceste substanțe, si care poseda proprietați dielectrice înalte, electrizarea micșoreaza productivitatea muncii si este unul din motive care duc la scăderea calitații producției. Influența sistematica a campului electrostatic de intensitate înaltă asupra corpului omului poate duce la unele dereglări funcționale a sistemului central nervos, a sistemului cardio-vascular si a altor organe. Din aceste motive, intensitatea maxim-admisibilă a cîmpului electric la locurile de muncă este normată:

Tabela 1

Intensitatea maxim-admisibilă a cîmpului electric la locurile de muncă

Intensitatile admisibile a campului electrostatic sunt indicate fără a lua in considerație influența asupra omului a descărcărilor electrice. Normele indicate pentru intensitatea cîmpului electrostatic mai mare de 20 kW/m se utilizează numai cu condiția, restul timpului a zilei de lucru intensitatea nu întrece 20 kW/m. Daca intensitatea cîmpului electrostatic întrece valorile indicate, atunci se aplică unele măsuri de micșorare a ei.

Masurile principale de micșorare a intensitații cîmpului electric in zona de lucru sunt:

indepărtarea surselor a cîmpurilor electrostatice din zona personalului care deservește aparatura;

ecranarea sursei cîmpului sau a locului de muncă;

utilizarea neutralizatorilor de sarcini electrice statice;

umezirea materialului care se electrizeaza;

schimbarea materialelor, care usor se electrizeaza cu materiale ce nu se electrizează;

alegerea suprafețelor care contactează conform condițiilor de electrizare minimă;

modificarea procesului tehnologic in așa mod ca să se micșoreze nivelul de electrizare;

alegerea materialelor si suprafețelor care greu electrizează alte corpuri sau le electrizează cu sarcini de polaritate diferită;

instalarea in toate incăperile, unde se află oameni, a podelelor care conduc curentul electric.

În calitate de masură de protecție individuală a omului de la electricitatea electrostatică poate servi incaltamintea ce conduce curentul electric, albituri, halat, etc. adica tot ce asigură legatura electrica a corpului omului cu pamantul.

In majoritatea monitoarelor moderne problema cîmpului electrostatic este parțial rezolvată prin întroducerea tehnologiei antistatice. Datorită acestei tehnologii cîmpul electrostatic se micsoreaza pana la 10% din intensitatea inițială a acestuia, in afara de aceasta majoritatea ecranelor protectoare, care micsorează iradierea ionizată, mai sigura si atenuarea considerabilă a cîmpului electrostatic.

Cîmpul electromagnetic creat de monitor este de asemenea un factor dăunator sanatații omului.

Influența cîmpurilor electromagnetice de mare intensitate asupra omului consta in absorbția de către țesuturile corpului uman a energiei, însă influența principală îi revine cîmpului electric. Nivelul de influență a campurilor electromagnetice asupra omului depinde de frecvența, de puterea emisiei, de durata actiunii, de regimul de emisie (prin impulsuri sau continuu), si de asemenea de proprietatile individuale ale organismului. Influenta cîmpului electric de frecvență joasa provoaca dereglari in activitatea functionala a sistemului cardio-vascular, si chiar la schimbari privind componența sangelui.

Influența cîmpului electromagnetic de frecvență înaltă se reflectă sub forma efectului termic, care duce la ridicarea temperaturii corpului, la supraincalzirea locala a tesuturilor corpului si a organelor cu o termoreglare slabă. Ca rezultat unii lucrători suferă din cauza insomniei, simt dureri in regiunea inimii, dureri de cap, usor obosesc.

Pentru a micșora puterea de emisie a sursei cîmpului electromagnetic pot fi utilizate urmatoarele mijloace tehnice:

utilizarea unui astfel de regim de lucrul, în care dispozitivul lucrează cu o putere mai mică decat cea proiectată;

lichidarea locurilor de emisie suplimentara;

micșorarea undelor reflectate prin ajustarea sarcinilor, etc.

Alegerea corecta a regimului de lucru a personalului si a utilajului permite micsorarea prezentei omului in zona de actiune a campurilor electromagnetice.

Utilizarea sistemelor de dirijare la distanta cu utilajul permite personalului sa-si indeplineasca functiile in afara zonei de actiune a campurilor electromagnetice.

Procesul de ecranare, des utilizat cu scopul de micșora influența cîmpurilor electromagnetice, utilizează fenomenul de absorbție si reflectare a energiei cîmpului electromagnetic. Pentru confecționarea ecranului se utilizează materiale cu o conductibilitate electrică înaltă (aluminiu, cupru, oțel), și cu proprietăți de absorbție și reflectare sub formă de foi si plasă. Ecranele obligatoriu se unesc la pămînt.

Eficacitatea acțiunii de ecranare a materialului se caracterizează prin adîncimea infiltrării cîmpului electromagnetic în ecran, care depinde de materialul de confecționare.

Adîncimea infiltrării cîmpului electromagnetic, la care acest cîmp scade de 2,718 ori:

δ=-2 μσπƒ

unde:

μ – permeabilitatea magnetică relativă a materialului ecranului, Hn/m;

σ – conductibilitatea relativă a materialului ecranului, cm/m;

ƒ – frecvența cîmpului electromagnetic Hz.

Adancimea infiltrarii a frecvențelor înalte si supraînalte în ecran de obicei nu intrece un milimetru, astfel grosimea ecranului se alege din considerente constructive.

1.2. Calcularea protectiei "legare la nul"

Legarea la nul este o masură de protejare a omului de electrocutare prin deconectarea strictă și în viteză a rețelei in caz de apariție a tensiunii pe carcasa (străpungerea izolării). Deconectarea stricta se efectueaza, daca curentul de scurt circuit format prin faza si firul nul este destul de mare pentru ca declansatorul sa funcționeze corect.

Scopul calcularii instalației "legarea la nul" – determinarea sectiunii firului nul, care satisface conditia funcționarii protecției maximale de curent. Valoarea protecției se determină după puterea instalației electrice proiectate (exploatate).

Curentul de scurtcircuit trebuie să depășească valoarea protecției conform cerințelor (pentru siguranțe Is.c. ≥ 3 In, unde In – curentul nominal al siguranței). Modul de calculare este urmatorul:

Se calculă rezistența circuitului "faza – nul":

unde:

Rf- rezistența activă a firului fazic, Ohm;

Rn – rezistența activă a firului nul, Ohm;

Xc – rezistența inductivă a rețelei "faza – nul" si pentru rețelele cu tensiune joasă (pîna la 1000 V) si firele din cupru si aluminiu, deci Xc este foarte mica (Xc = 0).

Rezistențele active se calculă dupa formula:

unde:

Lf, Sf, Ln, Sn – lungimea si secțiunea firului fazic si nul corespunzător;

ρ – rezistența electrică specifică: pentru cupru, ρcu =0.018 Ohm * (mm / m);

pentru aluminiu ρAI = 0.028 Ohm * (mm / m);

Deoarece materialul din care s-a confectionat cablul (firul) este cupru, lungimea firului de fază = 400 m, iar secțiunea firului = 16 mm vom obține urmatoarele calcule:

Pentru lungimea firului nul Ln = 400 m si sectiunea firului = 10 mm vom obtine:

curentul de scurt-circuit calculat in A:

unde:

Zt – rezistența transformatorului.

Pentru tensiunea U = 380 V si Zt / 3 = 0.0354 Ohm (din tabel) obținem urmatoarele calcule:

4) Se compara Is.c. cu In: daca Is.c. ≤ 3 In pentru siguranta atunci se aleg conductoare de o sectiune mai mare si calculul se repeta.

Deoarece In este egal cu 63 A obtinem:

315.24 A ≥ 189 A

Rezulta ca, curentul de scurtcircuit depaseste valoarea cerintelor obiectului protecția muncii (pentru siguranțe) sunt respectate.

1.3. Securitatea antiincendiară

Incendiu se numeste procesul necontrolat de ardere in afara unui loc de ardere special amenajat, ce aduce daune materiale.

În cadrul oricarei organizații, sau intreprinderi trebuie sa existe mijloace de anunțare, de apel rapid la serviciile orășenești antiincendiare in cazul apariției incendiului. Pentru obiectele de o importanță majoră sau periculoase, este recomandată posibilitatea legaturii telefonice directe cu sectia antiincendiara orășeneasca. Semnalizarea antiincendiară se execută cu ajutorul diferitor sisteme. Pentru a anunța despre incendiu se utilizează legatura telefonică, legatura radio, sirena, semnalizarea cu ajutorul clopotelor etc. Mijloacele de anunțare despre incendiu trebuie sa fie disponibile toate 24 ore.

Semnalizarea incendiului se executa de diferite sisteme. Cel mai simplu si mai des utilizat este semnalizatorul manual, care se activează prin apăsarea butonului. Așa semnalizatoare se instalează pe scări, in paliere și sunt vopsite in culoarea roșie.

In timpul de față larg se utilizează semnalizatoarele automate, care conform principiului de lucru se împart in cele termice, de fum, combinate si optice.

Semnalizatoarele termice de acțiune maximă acționează la deformarea unei placi bimetalice, la incalzirea ei pîna la 60, 80, 100 °C în dependența de reglaj.

În semnalizatoarele termice semiconductoare, in calitate de elemente sensibile sant termorezistentele, din cauza cărora se schimbă curentul in rețea la incalzirea lor.

Termosemnalizatoarele diferențiale reacționează la ridicarea rapidă a temperaturii (la 30°C timp de 7 secunde), iar in calitate de element sensibil se folosește elementul la incălzirea caruia apare termo-FEM.

În semnalizatoarele de fum in calitate de element sensibil se utilizeaza camera de ionizare, in care sub acțiunea izotopului radioactiv (plutoniu-239) apare un curent de ionizare. Aparitia fumului in cameră marește consumul de raze ceea ce cauzează micșorarea curentului de ionizare.

În semnalizatoarele combinate se foloseste interconectarea semnalizatorului de fum cu cel termic. La camera de ionizare se mai conectează în plus incă o termorezistență.

Semnalizatoarele combinate reactionează atît la apariția fumului, cît și la schimbarea temperaturii. Semnalizatoarele optice reacționează la razele ultraviolete ale spectrului flacarii, deoarece elementul sensibil reprezintă contoarele de fotoni. Semnalizatoarele de diferite tipuri pot controla suprafete de la 15 pînă la 100 m .

Semnalizatoarele de fum si cele combinate nu se instaleaza in incaperi umede si prafuite, sau in incaperi in care se contin vapori de acizi, baze, sau unde temperatura este mai mare decat 80 °C, deoarece in asa locuri poate avea loc actionarea falsa ale semnalizatoarelor.

1.3.1. Cauzele apariției incendiilor

Procesul de ardere este posibil in cazul cînd este prezentă substanța arzatoare, sursa de aprindere si oxidantul, care în cele mai dese cazuri este oxigenul, ce se conține in aer. La reducerea concentrației oxigenului din aer pînă la 12-14% arderea majoritatii substanțelor se oprește. Procesul de ardere este posibil și în lipsa oxigenului – deoarece hidrogenul, stibiul si unele metale ard în clor. Unele substanțe (turba, carbunele, funinginea, carpele uleioase), numite piriforme pot sa se autoinflameze la contactul cu aerul. Auto-aprinderea acestor substanțe are loc in urma proceselor chimice, termice sau microbiologice. Substanțele se încălzesc sub acțiunea căldurii ce vine din afară, ce se elimină in timpul reacțiilor chimice, și de asemenea in rezultatul acțiunii micro-organismelor.

În procesul de producție, incendiul poate apare in urma unor cauze de ordin electric sau ne electric. La cauzele de ordin ne electric se refera:

funcționarea proastă a instalațiilor de producție si dereglarea procesului tehnologic; comportarea iresponsabila sau ne atentă cu focul (fumatul, lăsarea fără supraveghere a dispozitivelor de incălzire);

construcția incorectă sau dereglarea sistemului de ventilare;

autoinflamarea materialelor.

La cauzele de ordin electric se referă:

scurtcircuitul;

supraîncărcarea conductoarelor;

rezistența mare de trecere;

scanteierea;

electricitatea statică și descărcarea fulgerului;

arcul electric ce apare in timpul sudarii electrice si in timpul operatiilor gresite cu aparatajul de comutare;

instabilitatea tensiunii electrice din rețea – ca rezultat se aprind unele circuite integrate din calculator, sau monitor, etc.

1.3.2. Mijloacele de stingere a incendiilor

Cel mai raspîndit mijloc de stingere a incendiilor este apa, ce posedă o capacitate termică enormă și o temperatură mare de vaporizare, ceea ce permite de a lua caldura din focarul incendiului, in același timp apa nu poate fi folosită pentru stingerea solutiilor ușor inflamabile (benzina, gaz lampant, ulei mineral), deoarece din cauza greutații relative mari, ea se aduna sub aceste soluții si imprastiindu-se usor si rapid măresc considerabil suprafața de ardere. De asemenea, se interzice stingerea cu apă a substanțelor ce elimină reagenti inflamabili (carbid de calciu, silitra) la contactarea lor cu apa.

Pentru stingerea instalațiilor electrice sub tensiune, apa nu poate fi folosită fără masuri speciale de protecție a oamenilor de la atingerea curentului electric prin getul de apă. În cladiri, in locuri special rezervate, se instalează scuturi antiincendiare, ce conțin unele rechizite necesare pentru stingerea focului: robinet de presiune, țeava elastică, în unele locuri nisip, galeți, topoare si alte instrumente de distrugere a pereților.

O mare răspîndire au căpătat mijloacele automate de detectare si stingere a incendiului. Principiul de funcționare a acestora, in majoritatea cazurilor, se bazează pe prezența unor țevi in interiorul carora se afla apa sub presiune, si niste dopuri din materiale ce se topesc ușor, întroduse in aceste țevi. La ridicarea temperaturii in incapere, dopurile se topesc si apa din țevi sub actiunea presiunii stropește focul.

O modalitate efectivă in prevenirea incendiilor, minimizarea daunelor si reducerea jertfelor omenești este familiarizarea muncitorilor, copiilor si a populatiei in intregime cu regulile de comportare in situații de incendiu, modalitatile de stingere a focului, normele elementare de prevenire a incendiului.

1.3.3. Securitatea antiincendiară in salile de calcul

Pentru a analiza nivelul securitatii incendiare a locurilor de munca, a zonelor de producție, a sălilor de calcul se foloseste urmatoarea clasificare :

l. Clasificarea materialelor de construcție si construcțiilor după nivelul de inflamabilitate:

ne inflamabile;

greu inflamabile;

inflamabile;

2. Clasificarea construcțiilor dupa nivelul rezistența la incendiu (limita nivelului de rezistenta la incendiu – timpul in ore din momentul inceperii incendiului pana la momentul apariției crăpăturilor).

3. Clasificarea încțăperilor dupa RCIE ("Regulile de Constructie a Instalatiilor Electrice"):

cu pericol de explozie;

cu pericol de inflamare. Criteriile de apreciere:

Conținutul de substanțe inflamabile;

Regimul termic de prelucrare.

4. Clasificarea proceselor de producție după pericolul incendiar:

cu pericol de explozie;

cu pericol de explozie si inflamare;

cu pericol de inflamare;

fara pericol de inflamare;

Conform primei clasificări (clasificarea materialelor de constructie si constructiilor după nivelul de inflamabilitate) sala de calcul este ne inflamabila deoarece sunt prevazute multe masuri de prevenire a incendiului cum ar fi: sisteme de semnalizare, podele din metal, mese metalice, pereții in sala de calcul se acoperă cu substanțe ne arzatoare.

După clasificarea a doua (clasificarea construcțiilor după nivelul de rezistență la incendiu), de obicei salile de calcul se afla in cladiri construite sau din beton armat sau cotelet (pentru institutiile de invatamant). Ambele materiale de constructie au o rezistență la incendiu mare – peretii in sala de calcul se acopera cu substante ne arzatoare.

Dupa clasificarea a treia (dupa Regulile de Constructie a Instalatiilor Electrice), luînd în considerație conținutul mic de substanțe inflamabile si regimul termic de prelucrare, salile de calcul pot fi caracterizate – cu pericol mic de inflamare.

Salile de calcul dupa pericolul incendiar a proceselor de producție se referă la categoria celor cu pericol de inflamare ceea ce se explică prin faptul, că în incăpere se gasesc substanțe inflamabile: de obicei, aceste sali sunt echipate cu utilaj care contine masă plastică, care totuși arde. Trebuie însă de menționat, in ultimul timp masa plastică utilizată la fabricarea tehnicii de calcul are o astfel de componență chimică, care nu arde sau care se autostinge după primele secunde de ardere. În sala de calcul de obicei lipsesc așa atribute cum ar fi : covoare, obiecte din lemn, dulapuri cu carti, etc. Reiese că, cu toate că pericolul de inflamare există, el este foarte mic.

Securitatea antiincendiară poate fi asigurată prin masuri de profilaxie antiincendiara si prin respectarea regulilor de prevenire a incendiului. Noțiunea de profilaxie antiincendiară include un complex întreg de masuri, necesare pentru preîntîmpinarea apariției incendiului sau reducerea urmarilor lui.

1.3.4. Masurile profilactice de protecție cu cauzele incendiului in salile de calcul

Măsurile de eliminare a cauzelor incendiilor si exploziilor se divizează în:

măsuri tehnice;

măsuri de exploatare;

măsuri organizatorice;

măsuri de regim.

La măsurile tehnice se referă – respectarea normelor antiincendiare la construcția cladirilor, sistemului de incălzire, sistemului de ventilare, la alegerea și montarea echipamentului electric, sistemele paratrasnet.

La măsurile de exploatare se referă – exploatarea corecta a utilajului de producere, instalațiilor de compresie, cuptoarelor si a altor dispozitive de forță și a utilajului electric; menținerea corectă a incaperilor, a cladirilor si a teritoriului intreprinderii.

La măsurile organizatorice se referă – studierea regulilor antiincendiare de catre personalul intreprinderii, sau organizației, editarea instrucțiunilor și placatelor necesare.

La măsurile de regim se referă – interzicerea sau impunerea unor restricții de utilizare a focului deschis, fumatului, a lucrarilor de sudare in anumite locuri.

La proiectarea si construcția clădirilor si incăperilor, (in particular a salii de calcul), de asemenea trebuie să se respecte masurile antiincendiare:

protecția construcțiilor de lemn (dacă sunt) se realizează prin îmbibarea cu substanțe chimice ne inflamabile (antipirene), acoperirea cu vopsele refractare;

pentru limitarea extinderii incendiului se fac obstacole antiincendiare: pereți, bariere, usi, porti, ferestre. Toate acestea trebuie indeplinite din materiale ne arzatoare.

Masurile active de lupta cu incendiile in salile de calcul:

izolarea locului de ardere de aer cu ajutorul substantelor solide (nisip, paturi, etc.);

racirea focarului pana la unele temperaturi stabilite, care se face cu ajutorul apei, insa apa are restrictii la stingerea substantelor inflamabile, instalatiilor electrice, etc., de aceea mai des se foloseste bioxidul de carbon, care in reactie cu aerul micsoreaza temperatura pana la -78° C;

reducerea vitezei petrecerii reactiei chimice in flacara – in acest scop se folosesc prafurile;

distrugerea mecanica a flacarii in rezultatul actionarii asupra ei a unui get puternic de gaz sau apa.

Pentru stingerea focului în salile de calcul se utilizează extinctoarele cu CO2 si praf, care posedă o viteză mare de stingere, timp indelungat de actiune, posibilitate de stingere a instalatiilor electrice, eficacitate inaltă de luptă cu focul.

Reieșind din normele securitatii antiincendiare, pentru o sală de calcul cu suprafata de 100 m sunt necesare urmatoarele mijloace primare de stingere a incendiului:

un extinctor de CO2 de tip OU-5 sau OU-8, cu ajutorul caruia se poate stinge flacara de pe diferite materiale si instalații electrice (pana la 1000 V);

un extinctor de spumă chimică (OHP-10) sau un extinctor de spumă (OVP-5 sau OVP-10) pentru stingerea materialelor solide si lichidele inflamabile (in afara de instalatiile sub tensiune);

pasla sau asbest (l X l; 2X l ,5; 2X2 m).

Salile de calcul trebuie sa fie echipate cu semnalizatoare incendiare – pentru semnalizarea aparitiei incendiului, in calitate de semnalizatoare incendiare pentru salile de calcul se utilizează semnalizatoarele de fum fotoelectrice de tip IDF-1 sau DIP-1.

În dependentă de inaltimea podului (3 m) si aria podelei (40 m.), dupa norme este suficientă prezența a trei semnalizatoare pentru toată incaperea. Aceste dispozitive se caracterizează printr-o viteză mare, sensibilitate înaltă si care functionează după principiul difuziunii caldurii de catre particulele de fum.

Avantajul acestor semnalizatoare constă in lipsa inerției, controlul unei suprafețe mari. Neajunsul lor este posibilitatea acționării false si costul ridicat.

Toate sistemele, care utilizează curent electric – dispozitivele de repartizare, aparatele de masură, sistemele de siguranță și alte aparate electrice trebuie sa fie montate pe suporturi care nu ard (marmor, textolit, asbest, etc.).

Masurarea rezistentei izolatiei circuitului electric trebuie sa se execute in fiecare an in 1 incaperile cu mediul normal, iar in incaperile cu umiditate inaltă, cu exces de gaze si aburi – nu mai rar de 2 ori pe an.

Suportul metalic, carcasele echipamentelor electrice si electronice, de asemenea țevile metalice, prin care trece sarmele electrice, trebuie sa fie conectate la pămînt.

In gospodaria obiectelor electrice deseori se utilizează acumulatoarele, incarcarea carora se insoțește de emisia gazelor si aburilor explozive si periculoase pentru sanatateaomului. Din aceste motive acumulatoarele trebuie instalate in incaperi aparte, bine izolate de celelalte, cu o ventilare corespunzatoare.

Aceste masuri sint mai mult valabile pentru acumulatoarele produse pînă în anul 1990. Astăzi acumulatoarele, care se utilizează la alimentarea calculatoarelor, sint proiectate si fabricate dupa alte tehnologii mai avansate, si incarcarea lor nu se mai insoteste de emisia gazelor si aburilor explozive si periculoase.

În caz de incendiu trebuie sa fie prevazută posibilitatea evacuarii rapide a oamenilor. Caile de evacuare trebuie sa asigure evacuarea tuturor oamenilor, care se află în incaperile întreprinderii intr-un timp foarte scurt.

Numarul iesirilor de evacuare din incaperi si de la fiecare etaj trebuie sa se stabilească în corespundere cu FOCT 2.09.02-85, și sa fie nu mai putin de două ieșiri.

Similar Posts