过程和作用域
TCL中的过程类似于C中的函数。
1.过程定义和返回值
TCL中过程是由proc命令产生的:
例如:
% proc add {x y } {expr $x+$y}
proc命令的第一个参数是你要定义的过程的名字,第二个参数是过程的参数列表,参数之间用空格隔开,第三个参数是一个TCL脚本,代表过程体。 proc生成一个新的命令,可以象固有命令一样调用:
% add 1 2
3
在定义过程时,你可以利用return命令在任何地方返回你想要的值。 return命令迅速中断过程,并把它的参数作为过程的结果。例如:
% proc abs {x} {
if {$x >= 0} { return $x }
return [expr -$x]
}
过程的返回值是过程体中最后执行的那条命令的返回值。
2.局部变量和全局变量
对于在过程中定义的变量,因为它们只能在过程中被访问,并且当过程退出时会被自动删除,所以称为局部变量;在所有过程之外定义的变量我们称之为全局变量。 TCL中,局部变量和全局变量可以同名,两者的作用域的交集为空:局部变量的作用域是它所在的过程的内部;全局变量的作用域则不包括所有过程的内部。这一点和C语言有很大的不同。
如果我们想在过程内部引用一个全局变量的值,可以使用global命令。例如
全局变量a在过程中被访问。在过程中对a的改变会直接反映到全局上。若去掉语句global a,TCL会出错,因为它不认识变量a
% set a 4
4
% proc sample { x } {
global a
incr a
return [expr $a+$x]
}
% sample 3
8
%set a
5
3.缺省参数与可变参数
TCL还提供三种特殊的参数形式:
1)首先,你可以定义一个没有参数的过程,例如:
proc add {} { expr 2+3}
2)其次,可以定义具有缺省参数值的过程,我们可以为过程的部分或全部参数提供缺省值,如果调用过程时未提供那些参数的值,那么过程会自动使用缺省值赋给相应的参数。和C\C++中具有缺省参数值的函数一样,有缺省值的参数只能位于参数列表的后部,即在第一个具有缺省值的参数后面的所有参数,都只能是具有缺省值的参数。
proc add {val1 {val2 2} {val3 3}}{
expr $val1+$val2+$val3
}
则:
add 1 //值为6
add 2 20 //值为25
add 4 5 6 //值为15
3)另外, TCL的过程定义还支持可变个数的参数,如果过程的最后一个参数是args, 那么就表示这个过程支持可变个数的参数调用。调用时,位于args以前的参数象普通参数一样处理,但任何附加的参数都需要在过程体中作特殊处理,过程的局部变量args将会被设置为一个列表,其元素就是所有附加的变量。如果没有附加的变量, args就设置成一个空串,下面是一个例子:
proc add { val1 args } {
set sum $val1
foreach i $args {
incr sum $i
}
return $sum
}
则:
add 2 //值为2
add 2 3 4 5 6 //值为20