1. 过程基础:proc与return
过程由proc命令创建,示例如下:
proc plus {a b} {
expr {$a+$b}
}
2. 局部和全局变量:
当
Tcl处理过程块时,它会使用与调用者不同的变量集。这些变量称为局部变量,经们仅由这个过程访问,在过程返回后就被删除。在过程之外定义的变量称为全局变量,全局变量是长期存在的,仅在明确删除后才会被消失。
过程可以用global命令引用全局变量。
% global x y
3. 参数变量的数目和默认设置:
参数列表可以指定为一个空字符串。这种情况下过程不获取参数,如呆带参数地调用它会产生错误。
参数列表实际上是列表的列表,每一个子列表对应第一个参数。如果子列表只有一个元素,那么这个元素就是参数的名称。如果子列表含有两个元素,第一个元素就是参数名,而第二个元素则是它的默认值。
proc inc {value {increment 1}} {
expr $value+$increment
}
参数列表中的第一个元value,指定了名称而没有指点定默认值。第二个元素指定了名为increment的参数,并指定其默认值为1。这意味着调用incr时可以给出一个或两个参数。
如果proc命令中没有给一个参数设置默认值,在调用过程时就必须给出这个参数。而默认参数,无论是多少个,都必须放在过程的参数列表的尾部。如果为一个特定参数设置了默认值,那么列表中它后面的所有参数都必须设置默认值。
参数列表的第三个特殊功能支持可变数量个参数。如果参数列表中的最后一个元素是特殊名称args,那么调用过程时可以给出可变数昨个参数。args之前的参数的处理方式与前面相同,在它们之后可以再指定任意个参数。过程的局部变量args会被设置成一个列表,其元素就是这些更多的参数。如果没有更多的参数,args会设置为空字符串。
如果过程的参数列表在args前面还有参数,它们的默认设置方式与前面所讲的相同。args不能设置默认值,它的默认值就是空字符串。
4. 传引用调用:upvar
upvar命令提供访问当前过程上下文范围之外的变量的通用机制。可以用于访问全局变量、命名空间变量以及其它活动中的过程内的局部变量。
% proc printArray {name} {
%upvar $name a
%foreach b [lsort [array names a]] {
%puts "$b = $a($b)"
%}
% }
% set info(age) 37
% set info(position) "Vice President"
% printArray info
> age = 37
> position = Vice President"
upvar的第一个参数是过程的调用环境可见的变量,可以是一个全局变量,也可以是一个命名空间变量。第二个参数是一个局部变量的名称。
5. 创建新的控制结要构:uplevel
uplevel命令像是eval和upvar的结合。它把它的参数作为脚本处理。但处理脚本的变量上下文环境却不在调用堆栈层级中。
% proc do {varName first last body} {
%upvar $varName v
%for {set v $first} {$v<=$last} {incr v} {
%uplevel $body
%}
% }
% set squares {}
% do i 1 5 {lappend squares [expr $i*$i]}
% set squares
> 1 4 9 16 25
% set i
> 6
6. 应用匿名过程:
apply命令提供了把参数集合应用于匿名过程的功能。
apply {argList body ?namespace?} ?arg1 arg2 ...?
apply的第一个参数是过程定义,由包含两个或三个元素的列表构成。第一个元素是过程的形式参数,定义方式与proc相同。第二个元素是实现过程块的Tcl脚本。第三个元素是可选的,如果提供,就指明运行过程的命名空间。传给apply的其他参数是赋给过程参数的值。