tcl/tk过程
過程基礎(chǔ):
過程由?proc?命令創(chuàng)建,格式如下:
proc 過程名 參數(shù)列表 過程體
實例如下:
proc plus {a b} {expr {$a + $b}}
plus命令的返回值就是它的過程塊中最有一個命令的返回值。
可以用return提前返回,?return?的參數(shù)就是該過程的返回值。下面是使用return命令的階乘功能實現(xiàn):
proc fac {x} {
?if {$x <= 1} {
??return 1;
?}
?return [?expr?{$x * [fac [expr {$x - 1}]]}]
}
fac 4
=>24
fac 0
=>1
局部和全局變量:
過程可以使用?global?命令引用全局變量。例如,下面這條命令讓全局變量x y在過程中可見
global x y
global命令把它的每一個參數(shù)作為全局變量的名稱對待,將過程中對這些變量名的引用定向到全局變量而非局部變量。
global命令可以在過程中的任何時候調(diào)用;一旦調(diào)用,它就會一直有效,知道過程返回。
參數(shù)個數(shù)和默認(rèn)值設(shè)置:
過程可以有0個參數(shù),只需要參數(shù)列表為 {} 即可:
proc printVars {} {
??puts?"a is $a,b is $b"
}
設(shè)置參數(shù)默認(rèn)值:
proc inc {value {increment 1}} {
?expr $value+$increment?
}
該過程有兩個參數(shù),一個固定參數(shù)value,一個可選參數(shù)increment,默認(rèn)值是1。
可選參數(shù)在調(diào)用時可以不必給出。
inc 42 3
=>45
inc 42
=>43
默認(rèn)參數(shù)必須放在參數(shù)列表的尾部。如果一個參數(shù)是默認(rèn)參數(shù),那么參數(shù)列表中它后面的參數(shù)都必須是默認(rèn)參數(shù)。
特殊參數(shù)?args?;
如果參數(shù)列表中最后一個參數(shù)是特殊名稱args,那么可以給出可變數(shù)量個參數(shù)。
例如下面這個過程,獲取任意個參數(shù),返回它們的和:
proc sum {base args} {
?set total 0
??foreach?val $args {
??set total [?expr?{$total + $val}]
?}
?return [expr {$base + $total}]
}
其中base參數(shù)必須給出。使用如下:
sum 1
=>1
sum 1 2
=>3
sum 1 2 3
=>6
sum?
=>wrong # args: should be "sum base ?arg ...?"
提示錯誤,base參數(shù)未指定。
傳引用調(diào)用upvar:
可以用?upvar?命令模擬傳引用調(diào)用的行為,這對數(shù)組特別有用。如果a是一個數(shù)組,就不能像myproc $a這樣把它傳給過程myproc,因為并沒有
對應(yīng)整個數(shù)組的值;只有對應(yīng)各個數(shù)組元素的值。
但是可以把數(shù)組名傳給過程,myproc a,然后使用upvar命令在過程中訪問數(shù)組的元素。
下面是在過程中使用upvar的簡單示例,輸出一個數(shù)組的內(nèi)容:
proc printArray {name} {
?upvar $name a
?foreach el [?lsort?[?array names?a]] {
??puts "$el=$a($el)"
?}
}
set info(age) 37
set info(position) "vice president"
printArray info
=>age=37
? position=vice president
?
上述代碼中upvar命令使得過程可以通過變量a訪問這個數(shù)組。
應(yīng)用匿名過程:
apply?{argList body ?namespace?} ?arg1 arg2 arg3 ...?
argList是過程的形參,body是實現(xiàn)過程塊的tcl腳本,?namespace?是可選的,指明運(yùn)行過程的命名空間。
?arg1 arg2 arg3 ...?是賦給過程參數(shù)的值。
下面這個匿名過程對一下數(shù)求和:
apply {{args} {
?set total 0
?foreach val $args {
??set total [expr {$total + $val}]
?}
?return $total
}} 1 2 3 4 5 6 7
=>28
它把1 2 3 4 5 6 7作為一個列表傳給過程的形參args,然后匿名過程計算并返回這些值的和。
一個更有代表性的例子,考慮對一個列表依據(jù)各個元素的字符串長度排序。lsort命令的-command選項可以指定自己的排序過程。
set states {333 22 4444 1}
lsort -command {apply {{e1 e2} {
?????????????????????????? ??expr {[?string length?$e1] - [string length $e2]}
?????????????????????????? ?}
????????????????????? }
??????????????????? } $states
=>1 22 333 4444????????????
apply 可以用于創(chuàng)建實現(xiàn)不同功能的結(jié)構(gòu)塊。下面的代碼展示了map命令的實現(xiàn)。
proc map {lambda list} {
?set result {}
?foreach el $list {
??lappend result [apply $lambda $el]
?}
?return $result
}???????
?map {x {expr {$x*$x}}} {1 2 3 4}
?=>1 4 9 16
?map {x {return [?list?[string length $x] $x]}} {a bb ccc dddd}
?=>{1 a} {2 bb} {3 ccc} {4 dddd}
轉(zhuǎn)載于:https://www.cnblogs.com/kane1990/archive/2011/12/19/2293981.html
總結(jié)
- 上一篇: 让你的AIR程序脱离AIR环境运行
- 下一篇: GoAhead2.5源代码分析之6-访问