Tcl 基本语法
在开始之前,我想先吓唬你一下。如果你看到下面的代码就吓跑了,那就少了一个 Tcl 程序员,也就少了像我这样优秀的 Tcl 程序员的竞争。如果你仍然勇敢,或者假装勇敢,那就太好了。
一开始我就警告过大家,虽然 Tcl/Tk 是一种很容易掌握的语言,但学习起来并不那么容易。原因就在这里。将 3 和 4 相加并将结果放入变量 sum 的代码在许多流行语言(如 C、C++、Perl、Java 等)中几乎是相同的。那就是:
a=3+4;
而在 Tcl 中,则是:
set a [expr 3 + 4]
还不害怕吗?你会害怕的。这种“奇怪”的语法,是因为 Tcl 脚本是由命令组成的,命令之间用新行或分号隔开。命令的基本格式都是一样的,如下例所示:
expr 3 + 4
这条命令计算 4
和 3
的和,并返回结果 7
。返回的值被 set
命令接收并赋值给变量 a
。
变量
Variables
Tcl 允许在变量中存储值,并在随后的命令中使用这些值。set
命令用于写入和读取变量。例如,下面的命令修改变量 x
的值为 32
:
set x 32
这与下面的 C++/Perl/Java 代码一致:
x = 32;
在 Tcl 中不需要声明变量:变量会在首次被设置时自动创建。Tcl 变量没有类型:任何变量都可以保存任何值。要在命令中使用变量的值,请使用 变量替换,variable substitution, 如下例所示:
expr $x * 3
当命令中出现 $
时,Tcl 会将其后面的字母和数字,视为变量名,并用变量值代替变量名。在本例中,expr
命令收到的实际参数将是 32 * 3
(假设变量 x
的设置与上例相同)。咱们可以在任何命令的任何单词中,使用变量替换,甚至在一个单词中多次使用:
set cmd expr
set x 11
$cmd $x * $x
命令替换
Command substitution
咱们也可以在某条命令的参数中,使用另一命令的结果。这就叫做命令替换:
set a 44
set b [expr $a * 4]
当命令中出现 [
时,Tcl 会将其与匹配的 ]
之间的所有内容,视为嵌套的 Tcl 命令,a nested Tcl command。Tcl 会对嵌套命令进行计算,并将其结果,代入到括号内文本处那条包围起来的命令。在上例中,第二个 set
命令的第二个参数,将是 176
。
最后的说明:虽然 set b [expr $a * 4]
是正确的,但更有效的方法是 set b [expr {$a * 4}]
。这将加快操作速度,因为编译器能更好地处理后一种方法。
引号与花括号
Quotes and braces
双引号允许咱们指定出包含空格的一些词语。例如,请看下面的脚本:
set x 24
set y 18
set z "$x + $y is [expr $x + $y]"
这三条命令执行后,变量 z 的值为 24 + 18 is 42
。引号之间的所有内容,将作为一个单词传递给 set
命令。请注意:
-
命令和变量的替换,是在引号之间的文本上进行的;
-
引号本身并没有传递给命令。如果没有引号,
set
命令就会收到6
个参数,从而导致错误。
大括号提供了另一种将信息分组为一些单词的方法。与引号不同的是,大括号之间的文本不会进行替换:
set z {$x + $y is [expr $x + $y]}
这条命令,会将变量 z
设置为值 "$x + $y is [expr $x + $y]"
。
这也许是个不错的功能,但他们却与我用来编写 tcl 代码的编辑器语法高亮功能,玩起了游戏。那些丧心病狂的 Tcl 开发人员!