tcl/tk过程
過程基礎:
過程由?proc?命令創建,格式如下:
proc 過程名 參數列表 過程體
實例如下:
proc plus {a b} {expr {$a + $b}}
plus命令的返回值就是它的過程塊中最有一個命令的返回值。
可以用return提前返回,?return?的參數就是該過程的返回值。下面是使用return命令的階乘功能實現:
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命令把它的每一個參數作為全局變量的名稱對待,將過程中對這些變量名的引用定向到全局變量而非局部變量。
global命令可以在過程中的任何時候調用;一旦調用,它就會一直有效,知道過程返回。
參數個數和默認值設置:
過程可以有0個參數,只需要參數列表為 {} 即可:
proc printVars {} {
??puts?"a is $a,b is $b"
}
設置參數默認值:
proc inc {value {increment 1}} {
?expr $value+$increment?
}
該過程有兩個參數,一個固定參數value,一個可選參數increment,默認值是1。
可選參數在調用時可以不必給出。
inc 42 3
=>45
inc 42
=>43
默認參數必須放在參數列表的尾部。如果一個參數是默認參數,那么參數列表中它后面的參數都必須是默認參數。
特殊參數?args?;
如果參數列表中最后一個參數是特殊名稱args,那么可以給出可變數量個參數。
例如下面這個過程,獲取任意個參數,返回它們的和:
proc sum {base args} {
?set total 0
??foreach?val $args {
??set total [?expr?{$total + $val}]
?}
?return [expr {$base + $total}]
}
其中base參數必須給出。使用如下:
sum 1
=>1
sum 1 2
=>3
sum 1 2 3
=>6
sum?
=>wrong # args: should be "sum base ?arg ...?"
提示錯誤,base參數未指定。
傳引用調用upvar:
可以用?upvar?命令模擬傳引用調用的行為,這對數組特別有用。如果a是一個數組,就不能像myproc $a這樣把它傳給過程myproc,因為并沒有
對應整個數組的值;只有對應各個數組元素的值。
但是可以把數組名傳給過程,myproc a,然后使用upvar命令在過程中訪問數組的元素。
下面是在過程中使用upvar的簡單示例,輸出一個數組的內容:
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訪問這個數組。
應用匿名過程:
apply?{argList body ?namespace?} ?arg1 arg2 arg3 ...?
argList是過程的形參,body是實現過程塊的tcl腳本,?namespace?是可選的,指明運行過程的命名空間。
?arg1 arg2 arg3 ...?是賦給過程參數的值。
下面這個匿名過程對一下數求和:
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,然后匿名過程計算并返回這些值的和。
一個更有代表性的例子,考慮對一個列表依據各個元素的字符串長度排序。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 可以用于創建實現不同功能的結構塊。下面的代碼展示了map命令的實現。
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}
轉載于:https://www.cnblogs.com/kane1990/archive/2011/12/19/2293981.html
總結
- 上一篇: 让你的AIR程序脱离AIR环境运行
- 下一篇: GoAhead2.5源代码分析之6-访问