Tcl լեզվում պրոցեդուրները (կամ ֆունկցիաները) սահմանվում են proc հրամանի միջոցով։ Այն ստանում է երեք արգումենտ. ա) սահմանվող պրոցեդուրայի անունը, բ) արգումենտների ցուցակը, և գ) մարմինը։ Օրինակ, տրված x և y թվերից մեծը որոշող ֆունկցիան կարելի է սահմանել հետևյալ կերպ.
proc max { x y } {
if { $x > $y } then {
return $x
}
return $y
}
Կամ, եթե չենք ուզում օգտագործել if հրամանը.
proc max { x y } {
return [expr {$x > $y ? $x : $y}]
}
Այս երկու օրինակներում էլ return հրամանն օգտագործված է ֆունկցիայի մարմնից արժեք վերադարձնելու համար։ Tcl պրոցեդուրաները կառուցված են այնպես, որ եթե նրա մարմնում, կամ կատարման որևէ ճյուղում, որը բերում է պրոցեդուրայի ավարտի, բացակայում է return հրամանը, ապա ֆունկցիայի վերադարձրած արժեք է համարվում դրա կատարման ժամանակ վերջին արտահայտության հաշվարկված արժեքը։ Սա հաշվի առնելով, կարող են նախորդ օրինակը գրել առանց return հրամանի.
proc max { x y } {
expr {$x > $y ? $x : $y}
}
Եթե պրոցեդուրան սպասում է միայն մեկ արգումենտ, ապա սահմանման ժամանակ այդ միակ ֆորմալ արգումենտի անունը կարելի է գրել առանց ձևավոր փակագծերի։ Օրինակ, Սահմանենք մի պրոցեդուրա, որը ստուգում է տրված բառի պալինդրոմ լինելը.
proc palindrom? str {
string equal $str [string reverse $str]
}
Իսկ եթե արգումենտների ցուցակում վերջին կամ միակ արգումենտի անունը args է, ապա նրա միջոցով, որպես ցուցակ, պրոցեդուրայի մարմնին են փոխանցվում կամայական թվով արժեքներ։ Օրինակ, ահմանենք մի ֆունկցիա, որը հաշվում է երկու և ավելի թվերի թվաբանական միջինը.
proc average { a b args } {
set sum [expr {$a + $b}]
foreach n $args {
set sum [expr {$sum + $n}]
}
return [expr {$sum / (2 + [llength $args])}]
}
Ահա նաև այս պրոցեդուրայի օգտագործման մի քանի օրիակ.
average 1.1 2.2 ; # => 1.6500000000000001 average 1.1 2.2 5.5 4.4 3.3 ; # => 3.3 average 1.2 2.3 3.4 ; # => 2.3000000000000003
proc հրամանը հնարավորություն է տալիս սահմանել նաև լռելությոն (default) արժեքով արգումենտներ ունեցող պրոցեդուրաներ։ Այդ դեպքում արգումենտը տրվում է երկու տարրերի ցուցակի տեսքով, որոնցից առաջինը ֆորմալ արգումենտի անունն է, իսկերկրորդը՝ նրա լռելության արժեքը։ Օրինակ, սահմանենք մի ֆունկցիա, որը վերադարձնում է \(y\) թվի \(n\) աստիճանի արմատը՝ \(\sqrt[n]{y}\), եթե \(n\)-ը տրված չէ, այն համարվում է \(2\)։
proc root { y {n 2} } {
expr exp(log($y) / $n)
}
Ահա կիրառման օրինակներ.
root 1024 ; # => 32.0 root 1024 5 ; # => 4.0 root 1024 10 ; # => 2.0
No comments:
Post a Comment