Home - qdidactic.com
Didactica si proiecte didacticeBani si dezvoltarea cariereiStiinta  si proiecte tehniceIstorie si biografiiSanatate si medicinaDezvoltare personala
referate stiintaSa fii al doilea inseamna sa fii primul care pierde - Ayrton Senna





Aeronautica Comunicatii Drept Informatica Nutritie Sociologie
Tehnica mecanica

Calculatoare




Qdidactic » stiinta & tehnica » informatica » calculatoare
Comanda source - modularization source



Comanda source - modularization source


Modularization - source



Comanda source va incarca un fisier si il va executa. Asta perimte unui program sa fie impartit in mai multe fisiere cu fiecare procedura de clarificare a fisierelor si variabile pentru o anumita arie de functionalitate. Spre exemplu, se poate avea un fisier numit database.tcl care sa se contina toate procedurile pentru a avea de aface cu o baza de date sau cu un fisier numit gui.tcl care se ocupa cu creearea unei interfate grafice a userului cu tk. Scriptul principal poate pur si simplu sa includa fiecare fisier folosind comanda source. Tehnici mult mai puternice pentru modularizarea programului sunt aduse in discutie in urmatoarea lectie despre pachete.

Comanda poate fi folosita ca sa:

  • Separe un program in fisiere multiple.
  • Sa creeze un fisier care sa contina tooate procs-urile pentru un anumit set de functii.
  • Sa configureze programe.
  • Sa incarce fisiere data.

source fileName

Citeste scriptul din filename si il executa. Daca scriptul executa cu succes, source inapoiaza valoarea ultimulei expuneri din script.

Daca exista vreo greseala in script, source va arata acea eroare.



Daca exista o intoarcere (in afara de aceea din definitia proc) atunci source se va intoarce imediat, fara sa execute restul scriptului.

Daca filename incepe cu o tilda (~) atunci $env(HOME) va fi substitut pentru acea tilda ca si in comanda file.



Example

sourcedata.tcl:

# Example data file to be sourced
set scr [info script]
proc testproc
set abc 1
return
set aaaa 1

sourcemain.tcl:

set filename 'sourcedata.tcl'
puts 'Global variables visible before sourcing $filename:'
puts '[lsort [info globals]]n'

if

puts 'nNow executing testproc'
testproc

puts 'Global variables visible after sourcing $filename:'
puts '[lsort [info globals]]n'

AICI TREBUIE 31 .

Creating Commands – eval

O diferenta dintre Tcl si majoritatea adunatorilor este ca Tcl va da voie unui program executant sa creeze noi comenzi si le execute in timpul rularii.

O comanda tcl este definita ca fiind o lista de siruri in care primul sir este o comanda sau un proc. Orice sir sau lista care indeplineste acest criteriu poate sa fie evaluat si executat.

Comanda eval va evalua o lista de siruri ca si cand ar fi comenzi scrise la prompt-ul % sau cu sursa intr-un fisier. In mod normal comanda eval va rezulta valoarea finala a comenzii aflata in evaluare. Daca, comenzile de evaluat dau o eroare (de exemplu, daca exista o eroare de sintaxa intr-unul din siruri), atunci eval va da o eroare.

A se nota ca oricare: concat sau list pot fi folosite la creearea sirului de comanda,dar aceste doua comenzi vor creea siruri de comanda putin mai diferite.

eval arg1 ??arg2?? ??argn??

Evalueaza arg1 - argn ca una sau mai multe comenzi Tcl. The args sunt inlantuite intr-un sir si trecute la tcl_Eval pentru evaluare si executie.

Eval returneaza rezultatul (sau codul de eroare) evaluarii.

Example



set cmd
puts 'CMD IS: $cmd'
eval $cmd



if {
puts 'nDefining newProcA for this invocation'
set num 0;
set cmd 'proc newProcA '
set cmd [concat $cmd ' ']
eval $cmd
}

puts 'nThe body of newProcA is: n[info body newProcA]n'

puts 'newProcA returns: [newProcA]'
puts 'newProcA returns: [newProcA]'


# Defind a proc using lists


if {
puts 'nDefining newProcB for this invocation'
set cmd 'proc newProcB '
lappend cmd
lappend cmd

eval $cmd
}

puts 'nThe body of newProcB is: n[info body newProcB]n'
puts 'newProcB returns: [newProcB]'





More command construction - format, list


Ar putea exista cateva rezultate neasteptate cand se incearca o creeare a sirurilor de comanda pentru eval

De exemplu:

eval puts OK

va printa sirul OK. totusi,


eval puts Not OK

va genera o eroare.

Motivul pentru care a doua comanda genereaza o eroare este acela ca eval foloseste concat pentru a-si imbina argumentele intr-un sir de comanda. Aceasta cauzeaza ca cele doua cuvinte NOT OK sa fie tratate ca doua argumente la puts. Daca exista mai mult de un argument la puts, primul argument trebuie sa fie un indicator de fisiere.

Moduri corecte de a scrie a doua comanda sunt acestea:


eval [list puts ]

eval [list puts 'Not OK']

set cmd 'puts' ; lappend cmd ; eval $cmd

Atata timp cat se inregistreaza cum sunt grupate argumentele prezentate lui eval, se pot cauza multe metode de formare a sirurilor pentru eval, incluzand comanda string si fornat.

Metodele recomandate de a construi comenzi pentru eval sunt de a folosi comenzile list si lappend. Aceste comenzi devin dificil de folosit daca trebuie folosite paranteze drepte in comanda, asa cum a fost facut in lectia anterioara.


Exemplul de la lectia anterioara este re-implementat in codul exemplu, folosind lappend.

Intregimea unei comenzi poate fi verificata cu info complete. Info complete poate fi folosit si intr-un program interactiv care sa determine daca linia tastata este o comanda completa sau doar introdusa de user pentru a forma comanda mai bine.

info complete string

Daca string nu are paranteze asemanatoare,acolade sau paranteze drepte atunci valoarea lui 1 este returnata,altfel rezulta 0.



Example


set cmd 'OK'
eval puts $cmd


set cmd 'puts' ; lappend cmd ; eval $cmd




set cmd 'NOT OK'
eval puts $cmd

eval [format puts 'Even This Works']

set cmd 'And even this can be made to work'

eval [format puts $cmd ]

set tmpFileNum 0;



set cmd
lappend cmd ''
lappend cmd 'global num; incr num; return '/tmp/TMP.[pid].$num''
eval $cmd

puts 'nThis is the body of the proc definition:'
puts '[info body tempFileName]n'



set cmd

if else
puts 'a and b with one pass of substitution: $a $$b'
puts 'a and b with subst in braces: [subst ]'
puts 'a and b with subst in quotes: [subst '$a $$b']n'


puts 'format with no subst [format $b]'
puts 'format with subst: [subst [format $b]]'
eval 'puts 'eval after format: [format $b]''



set num 0;
set cmd 'proc tempFileName '
set cmd [format '%s $cmd [pid] ]
set cmd [format '%s }' $cmd ]
eval $cmd

puts '[info body tempFileName]'


set a arrayname
set b index
set c newvalue
eval [format 'set %s(%s) %s' $a $b $c]

puts 'Index: $b of $a was set to: $arrayname(index)'


Changing Working Directory - cd, pwd



Tcl sustine si comenzi care schimba si arata directorul in care se lucreaza in acel moment.

Acestea sunt:

cd ?dirName?

Schimba directorul curent in dirName (daca dirName este dat sau directorului $HOME daca dirName nu este dat). Daca dirname este o tilda (~, cd schimba directorul de lucru cu directorul home al userilor. Daca dirname incepe cu o tilda, atunci restul elementelor sunt tratate ca un id de logat si cd schimba directorul in care se lucreaza cu $HOME al userului.

pwd

Reface directorul curent.

Example

set dirs [list TEMPDIR]


puts '[format '%-15s %-20s ' 'FILE' 'DIRECTORY']'

foreach dir $dirs
set c_files [glob -nocomplain c*]

foreach name $c_files

More Debugging – trace



Cand se deviruseaza un program. Este cateodata util sa se stie cand o variabila se schimba. Interpretul Tcl sustine o metoda pentru a urmari cand si cum o variabila este accesata. Cu comanda trace o porcedura poate fi definita pentru fi executata oricand este citita,scrisa nesetata o variabila.Cu aceasta comanda se poate determina proc-ul modificarea unei variabile, in ce a fost schimbata valoarea si ce variabile au fost in timpul ala.

Comanda trace executa la acelasi nivel al grupului asa cum o face si accesul variabilei. Proc-ul invocat de trace se afla cu un nivel mai jos. Altfel cu comanda uplevel o procedura chemata prin trace poate raporta conditiile puse cand a fost accesata o variabila.

trace variable variableName operation procname

Plaseaza o investigatie asupra variabilei lui variableName. Cand o variablename este accesata pentru operatiunea specificata in operatia argument, procedura procname va fi adusa in discutie.

Operatiunea este una de :

r Citit

w . Scris

u Nesetat

O variabila poate fi nesetata ori explicit cu comanda unset ori implicit cand o procedura se intoarce si taoite variabilele locale sunt eliberate.



Cand este accesat variableName, procname va fi numit cu trei argumente: variableName, elementName si operation. Daca variabila accesata este aranjata asociativ atunc elementName va contine numele elementului accesat. Daca variableName este o simpla variabila, atunci elementName va fi un sir gol. Operation este operatia care a fost facuta pe variablename ca sa fie invocata actiunea trace.

trace vdelete variableName operation procname

Anuleaza actiunea de gasire pentru operarea pe variableName.

trace vinfo variableName

Reface informatia despre urmele aplicate lui variableName.

Example


proc traceproc else

if else
}

proc testProc

trace variable i1 w traceproc
trace variable i2 r traceproc
trace variable i2 w traceproc

set i2 'testvalue'

puts 'ncall testProc'
testProc i1 i2

puts 'nTraces on i1: [trace vinfo i1]'
puts 'Traces on i2: [trace vinfo i2]n'

trace vdelete i2 r traceproc
puts 'Traces on i2 after vdelete: [trace vinfo i2]'

puts 'ncall testProc again'
testProc i1 i2



Command line arguments and environment strings

Scripturile sunt mult mai utile daca pot fi denumite cu valori diferite in linia de comanda.

De exemplu, un script care extrage o valoare speciala dintr-un dosar poate fi scris astfel incat sa caute, sa citeasca numele documentului si sa extraga datele. Sau poate fi scris ca sa treaca printre atatea fisiere cate sunt in linia de comanda si sa extraga datele din fiecare si sa printeze data si numele fisierului.

A doua metoda de a scrie programul  poate fi foarte usor folosita de la alte scripturi. Asta face totul mai util.

Numarul argumentelor comenzilor de sir ale unui script Tcl este trecut ca fiind variabila globala argc. Numele unui script Tcl este dat scriptului ca variabila globala argv0 si restul argumentelor comenzilor de sir sunt trecute ca o lista in argv.

Alta metoda de a trece informatiile printr-un script este cu ajutorul variabilelor de imprejurimi. De exemplu, a se presupune scrierea unui program in care userul prevede un fel de comentariu pentru a fi inregistrat. Ar fi bine sa se permita userului sa editeze comentraiile lor in editorul preferat. Daca userul a specificat un editor variabil la imprejurimi, atunci se poate invoca editorul pe care il pot folosi.

Sub supusele sisteme de operare Posix, variabilele de imprejurari sunt trecute intr-un script Tcl intr-o ordine env global asociativa. Indicele din env este numele variabilei imprejurimilor. Comanda puts '$env(PATH)' va printa continutul variabilei de imprejurimi PATH.


Example

puts 'There are $argc arguments to this script'
puts 'The name of this script is $argv0'
if

puts 'You have these environment variables set:'
foreach index [array names env]


Leftovers - time, unset


Cea mai simpla metoda de a face un script sa mearga mai repede este de a cumpara un procesor mai rapind. Din pacate. Asta nu este intotdeauna o optiune. Poate sa fie necesara optimizarea scriptului pentru a merge mai repede. Asta este dificil daca nu se poate masura timpul cat dureaza sa ruleze portiunea scriptului care se doreste optimizat.

Comanda time este solutia la aceasta problema. Time va masura cat dureaza executarea unui script. Apoi se poate modifica scriptul, reporni si observa cat a fost imbunatatit.

Mai poate fi necesar sa se optimizeze memoria folosita de script sau sa se curete variabile dupa fiecare trecere printr-un loop. Comanda unset va sterge o variabila din locul unde trebuie sa fie numele interpretului.

Dupa ce a fost rulat exemplul, jucati-va cu marimea contrapartidelor rutei in timetst1 si timetst2. Daca contrapartida interioara este 5 sau mai putin, poate dura mai mult executarea lui timetst2 decat a lui timest1. Asta pentru ca ia mai mult timp sa se calculeze si sa se repartizeze variabila k si daca loop-ul interior este prea mic, atunci castigul in a nu face inmultirea in interiorul loop-ului este pierduta in timpul care ia sa se calculeze loop-ul extern.

time script ?count?

Rezulta cate milisecunde a durat sa execute scriptul. Daca count este specificat, atunci va porni script count times si va rezulta media. Timpul este timpul trecut,nu timpul CPU.

unset variableName1 ?variableName2 ?

Sterge variableName din spatiul numelui interpretului . daca  variableName este un nume aranjat, atunci intregul aranjament va fi sters. Daca variableName este un element dintrun aranjament, atunci numai acelasi element va fi sters. If any of the variables to delete do not exist, then unset will return an error, and any variables after the non-existent variable will not be deleted.

Example




proc timetst1

proc timetst2

# Make a long list and a large array.

for



puts 'Time for list search: [ time 10]'
puts 'Time for array index: [ time 10]'




proc existence else
}



set x 1
set y 2
for

puts 'ntesting unsetting a simple variable'
;# Confirm that x exists.
existence x
;# Unset x
puts 'x has been unset'
unset x
;# Confirm that x no longer exists.
existence x




puts 'ntesting unsetting a member of an array'
existence a(0);
puts 'a0 has been unset'
unset a(0);
existence a(0);


puts 'ntesting unsetting several members of an array, with an error'
existence a(3);
existence a(4);
catch
puts 'nAfter attempting to delete a(3), a(0) and a(4)'
existence a(3);
existence a(4);

puts 'ntesting unsetting an array'
existence a;
puts 'a has been unset'
unset a;
existence a;



Channel I/O: socket, fileevent, vwait



Tcl I/O se bazeaza pe un canal. Un canal este conceptual asemanator lui FILE * in C sau un val in programarea unui shell. Diferenta este ca un canal poate fi ori un mijloc de curent ca un document, un tape drive sau tty sau o conexiune orientata construita ca un port.

Un canal baza pe un sir este format prin comanda open,asa cum a fost discutat si in lectia 26. Un canal bazat pe porturi este format printr-o comanda socket. Un port poate fi deschis fie ca un client TCO sau ca un server.

Daca un canal este deschis ca un server, atunci programul tcl va „urmari” pe acelasi canal o alta sarcina in incercarea de a se conecta cu ea. Cand asta se intampla, un nou canal este creeat pentru linku-ul acela (server-> new client) si programul tcl continua sa urmareasca legaturi pe numarul original al portului. In acest mod, un server unic Tcl ar putea interactiona cu mai multi cilenti.

Cand exista un canal,un handler poate fi definitivat cand va fi invocat atunci cand canalul este liber pentru citit sau scris. Acest handler este definit cu ajutorul comenzii fileevent. Cand o procedura tcl indeplineste gets sau puts unui procedeu de bloca si procedeul nu este pregatit pentru I/O, programul va fi blocat pana este gata planul. Ar putea dura mult pana cand celalalt sfarsit al canalului I/O trece offline. Folosind comanda fileevent, programul poate accesa numai canalul I/O cand este gata sa mute date.

In sfarsit, exista o comanda ca sa astepte  pana se intampla un eveniment. Comanda vwair va astepta pana este setata o variabila. Aceasta poate fi folosita pentru a crea un stil functional semnalant pentru interactiunea dintre client si server si sa anunte procedura dominanta ca a avut loc un eveniment.

A se observa exemplul:comanda socket este folosita ca si client si server si comenzile fileevent si vwait folosite de catre client si server pentru a controlaI/O dintre client si server.

A se nota ca in particular comenzile flush sunt folosite. Ca si un  canal care este deschis ca un conductor la comanda nu se trimit date decat atunci cand un flush este invocat sau este umplut un amortizor, canalele bazate pe porturi nu trimit automat date.

socket -server command ?options? port

Comanda socket impreuna cu –server flah deschid o conexiune pe server sau un port. Cand o conexiune se intampla la port, comanda proc este chemata cu argumente:

channel . . . .Canalul pentru clientul nou

address . . . . Adresa de IP a acestiu client

port. . . . . . . . Portul dat clientului

socket ?options? host port

Comanda socket fara optiunea –server deschide o conexiune clinet sistemului cu adresa de IP host si cu adresa portului port. Adresa Ip-ului poate fi data ca un sir numeric sau ca o adresa calificata de domeniu.

Pentru conectarea la host trebuie folosita adresa 127.0.0.1 (adresa loopback).

fileevent channelId readable ?script?

fileevent channelId writeable ?script?

comanda fileevent defineste o invocare a unui handler atunci cand are loc un eveniment care invoca  scriptul cand o data este pregatita a fi citita pe un channelId si writeable cand channelID este pregatit sa primeasca date.

vwait varName

Comanda vwait opreste executia scriptului pana cand actiunea de fundal seteaza valoarea lui vartName.O actiun de fundal poate fi un proc invocat printr-o fileevent sau o conexiune priza sau un eveniment de la un widget tk.

Example



proc serverOpen

proc readLine {
fileevent $channel readable
after idle 'close $channel;set out 1'
} else


set connected 0;
# catch server
set server [socket -server serverOpen 33000]

after 100 update;

set sock [socket -async 127.0.0.1 33000]
vwait connected

puts $sock 'A Test Line'
flush $sock
vwait didRead
set len [gets $sock line]
puts 'Return line: $len -- $line'

catch
vwait out
close $server







Contact |- ia legatura cu noi -| contact
Adauga document |- pune-ti documente online -| adauga-document
Termeni & conditii de utilizare |- politica de cookies si de confidentialitate -| termeni
Copyright © |- 2024 - Toate drepturile rezervate -| copyright