Փորձեցի մաթեմատիկական արտահայտությունների օրինակով գրել մի կարճ ծրագիր՝ օգտագործելով հենց այդ TclOO ընդլայնումը։ Այս օրինակս ընդհանուր պատկերացում տալիս է դասերի, կոնստրուկտորների, մեթոդների ու դաշտերի դահմանման մասին։
Եվ այսպես, նախ սահմանեմ
expression աբստրակտ դասը, որը ներկայացնում է միակ evaluate մեթոդը։oo::class create expression {
method evaluate {} {}
}
Այստեղ oo::class հրամանի create ենթահրամանով սահմանվում է դասը։ method հրամանով սահմանվում են դասի մեթոդները (այն շատ նման է proc հրամանին)։
Որպես
expression աբստրակտ դասի առաջին ընդլայնում սահմանեմ number դասը։ Նշելու համար, որ այն expression դասի ընդլայնում է (ենթադաս է), օգտագործվել է superclass հրամանը՝ արգումենտում expression դասի անունով։oo::class create number {
superclass expression
variable value
constructor { v } {
my variable value
set value $v
}
method evaluate {} {
my variable value
return $value
}
}
variable հրամանով հայտարարվում են դասի դաշտերը։ Այս դասի համար ես նախատեսել եմ թվի արժեքը ներկայացնող value դաշտը։ constructor հրամանով սահմանվում է դասի կոնստրուկտորը։ Այն ստանում է արգումենտների ցուցակ և կոնստրուկտորի մարմինը։ Դասի մեթոդներում, ինչպես նաև կոնստրուկտորում դասի դաշտերը (փոփոխականները) մատչելի են դառնում my հրամանով։ "my variable value" տողը հնարավորություն է տալիս կոնստրուկտորի մարմնում աշխատել value փոփոխականի հետ։ number դասի համար իրականացված evaluate մեթոդը պարզապես վերադարձնում է value փոփոխականի արժեքը։
expression դասի երկրորդ ընդլայնումը ունար գործողությունները մոդելավորող unaryex դասն է։ Սրա կոնստրուկտորը ստանում է ունար գործողության նշանակումը և այն ենթաարտահայտությունը, որի վրա պետք է կիրառել գործողությունը։
oo::class create unaryex {
superclass expression
variable oper subex
constructor { op ex } {
my variable oper subex
set oper $op
set subex $ex
}
method evaluate {} {
my variable oper subex
set res [$subex evaluate]
if {$oper eq "-"} {
set res -$res
}
return $res
}
}
evaluate մեթոդը նախ հաշվում է ենթաարտահայտության արժեքը, ապա, եթե գործողությունը "-" է, վերադարձնում է արժեքի բացասումը։
Եվ վերջապես,
expression դասի մի ընդլայնում ևս։ Սահմանեմ binaryex դասը, որը մոդելավորում է բինար "+", "-", "*", "/" և "%" գործողությունները։
oo::class create binaryex {
superclass expression
variable oper subex0 subex1
constructor { op exo exi } {
my variable oper subex0 subex1
set oper $op
set subex0 $exo
set subex1 $exi
}
method evaluate {} {
my variable oper subex0 subex1
set res0 [$subex0 evaluate]
set res1 [$subex1 evaluate]
set result 0
switch $oper {
"+" { set result [expr $res0 + $res1] }
"-" { set result [expr $res0 - $res1] }
"*" { set result [expr $res0 * $res1] }
"/" { set result [expr $res0 / $res1] }
"%" { set result [expr $res0 % $res1] }
}
return $result
}
}
Այստեղ առանձնապես բացատրելու բան չկա. օգտագործված են Tcl լեզվի պարզագույն հրամաններ։
proc example0 {} {
# (10 + 2 - 6) * 5 / -3 = -10
set n10 [number new 10]
set n2 [number new 2]
set n6 [number new 6]
set n5 [number new 5]
set n3 [number new 3]
set u0 [unaryex new "-" $n3]
set b0 [binaryex new "+" $n10 $n2]
set b1 [binaryex new "-" $b0 $n6]
set b2 [binaryex new "*" $b1 $n5]
set b3 [binaryex new "/" $b2 $u0]
set result [$b3 evaluate]
return $result
}
No comments:
Post a Comment