脚本、命令、单词
Tcl 脚本包含一条或更多的命令。命令通过换行符或分号隔开。
Tcl命令格式:
command parameter parameter
#中间由空白符或制表符隔开
#每一条命令由许多单词构成
#第一个单词是命令,后面都是参数
举例:
set a 24
set b 10
#命令通过换行符或分号隔开
set a 24; set b 10
处理命令
Tcl 处理命令:
解析
此阶段,Tcl解释器认为各单词没有意义,应用Tcl语法规则,将命令分解为单词,并执行替换。使得各个单词具有意义。
- Tcl是在进行字符串操作(例如,将字符串$input用input变量中存放的字符串代替)
- Tcl不知道也不关心替换后的字符串是一个数、一个组件名称还是其他内容。
Tcl解析器在解析命令的时候,并不会为其中的单词赋予任何含义。这些单词的含义决定于具体的命令过程,而不是Tcl 解析器。
#对于c语言
x = 4 ;
y = x +4;
#第一个C语句将整型值4存储在变量x中。
第二个C程序计算表达式x+10的值,取得变量x的值然后再加上 10,然后把这个值存储在变量y 中。
#在运行完成后,y中有一个整型值14。
#Tcl里
%set x 4 ;
%set y x +4;
x+4
#得到的结果是x+4这个字符串
#如果想求解一个表达式,必须进行明确要求
%set x 4 ;
%set y expr($x +4);
执行
在执行阶段,命令中的各个单词都有了具体的意义。
Tcl把第一个单词作为命令名称,检查这个命令是否已经定义,并且查找完成该命令功能的命令过程。
如果命令已经定义,Tcl解释器就调用该命令过程,把命令中的全部单词传递给该过程。
命令过程会根据自己的需要来分辨这些单词的意义;因为各个命令要完成的功能不同,各个命令所用的参数的意义自然也各不相同。
一些常见参数的意义
set a 122
#例如在set命令中,参数可以是任意形式的。
#set命令就是将第一个参数作为变量名,第二个参数作为变量的值。
set 122 a
#该命令是有效的:它创建一个名为122的变量,其值是a。
expr 24 / 3.2
#expr命令把它的参数连接起来,其结果必须是一个数学表达式。这个参数是一个表达式
lindex {red green blue purple} 2
#lindex的第一个参数是包含4个值的一个列表,这些值由空格隔开。
#该命令返回列表中索引为2的元素值(实际上是第3个元素 blue,索引是从零开始编号的)。
string length abracadabra
#有一些命令,如string 以及Tk 组件命令,实际上是把多条命令整合为一条。
#命令的第一个参数决定要进行的操作以及其他参数的含义。
#例如 string length需要另外一个参数,然后计算它的长度,而string,compare还需要另外两个参数。
#这样的整合式命令也称为集合命令。
button .b -text Hello -fg red
#.b后面的参数即选项-值对,用来设定所关心的选项,未被设定的选项将使用默认值。
Tcl替换形式
- 变量替换
- 命令替换
- 反斜线替换。
变量替换
#变量替换。由$符号引发,将Tcl变量的值插入单词中
%set kgrams 20
%expr $kgrams*2.204644.092
#第一条命令将变量kgrams的值设置为20。
#第二条命令将kgrams 的值乘以2.2046,计算出相应的磅数。
#这里就用到了变量替换:字符串$kgrams替换为变量kgrams的值,所以命令expr接收到的参数实际上是20*2.2046。
#变量替换可以在一个单词中的任何位置进行,可以进行任意多次
expr $result*$base
#变量名由$符号后面所有的数字、字母以及下划线组成。
#因此第一个变量名result到星号为止,第二个变量名就是base。
#变量替换可以用于各种目的,例如产生新的名称。
foreach num{ 1 2 3 4 5}{
button .b$num
}
#创建了5个按钮组件,分别名为.b1、.b2、.b3、.b4以及.b5。
命令替换
命令替换可以把一个单词的部分或全部替换为一个命令的结果。命令替换通过方括号表示,会调用括号中的命令。
set kgrams 20
set lbs [expr $kgrams*2.2046]44.092
#命令expr 会在解析set的单词时执行;它的结果,即字符串44.092,会成为set的第二个参数。
#和变量替换一样,命令替换也可以在单词的任何位置进行,在一个单词中可以有不止一处命令替换。
#方括号内的字符必须构成有效的 Tcl脚本。
#脚本可以包含任意多条命令,命令之间用换行符隔开,也可以用分号隔开。
#括号和它们之间的所有字符会被替换为脚本的结果。
反斜杠替换
反斜线接换行符可以用于将一条很长的命令写成几行。
双引号引用
引用:可以阻止解析器对$和分号等字符进行特殊处理。这些方法称为引用。
注意:双引号本身并不是单词的一部分,它是定界符。
如果一个单词的第一个字符是双引号,那么这个单词就由另一个双引号标记结束
如果单词不是以双引号开头,那么单词中的任何双引号都会作为普通字符处理,
大括号引用
大括号取消其中所有特殊字符的特殊意义。
%set msg fEggs: $2.18/dozen\nGasoline: $1.49/gallon}
Eggs: $2.187dozen \nGasoline: $1.49/gallon
#这个单词中不会发生任何替换,所有的空格、制表符、换行符以及分号都作为普通字符处理。
如果一个单词以左大括号开头,那么直到与它配对的右大括号为止,所有字符都将被原封不动地识别为这个单词的值。
大括号最重要的应用之一就是“延期处理”。延期处理意味着特殊字符不会被Tcl解析器立即处理。它们会被作为参数传递给命令过程。命令过程自己处理这些特殊字符,实际上多数时候就是把这些参数传给Tcl 解释器进行处理。
注释
如果一条命令的第一个非空白字符是#,那么这一行将被视为注释而忽略。
注意注释符必须出现在Tcl预期将获得命令的第一个字符的位置上。
如果注释符出现在其他地方,会被看作一个普通字符,看成一个命令单词的一部分。
正常返回和异常返回
正常返回:命令正常执行完成,返回了-一-个字符串值。
异常返回:最常见形式出现错误。当错误返回产生时,就意味着命令未能完成所期望的功能。该命令被放弃,它后面的脚本中的命令被略过。一个错误返回包含说明错误的字符串值,这个字符串通常由应用程序显示。