Tcl 基本语法

原文Basic Syntax of 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

这条命令计算 43 的和,并返回结果 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 命令。请注意:

  1. 命令和变量的替换,是在引号之间的文本上进行的;

  2. 引号本身并没有传递给命令。如果没有引号,set 命令就会收到 6 个参数,从而导致错误。

大括号提供了另一种将信息分组为一些单词的方法。与引号不同的是,大括号之间的文本不会进行替换:

set z {$x + $y is [expr $x + $y]} 这条命令,会将变量 z 设置为值 "$x + $y is [expr $x + $y]"

这也许是个不错的功能,但他们却与我用来编写 tcl 代码的编辑器语法高亮功能,玩起了游戏。那些丧心病狂的 Tcl 开发人员!

Last change: 2023-10-24, commit: 19a5cfd