Tcl学习2——Tcl语言语法

脚本、命令、单词

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预期将获得命令的第一个字符的位置上。

如果注释符出现在其他地方,会被看作一个普通字符,看成一个命令单词的一部分。

正常返回和异常返回 

正常返回:命令正常执行完成,返回了-一-个字符串值。

异常返回:最常见形式出现错误。当错误返回产生时,就意味着命令未能完成所期望的功能。该命令被放弃,它后面的脚本中的命令被略过。一个错误返回包含说明错误的字符串值,这个字符串通常由应用程序显示。
 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值