2005年的博

搬家到 http://blog.csdn.net/persuper/

导航

TCL脚本学习笔记(dujj)

主要关注网站:
http://tcltk.free.fr/
http://www.tclchina.com/
http://aspn.activestate.com/ASPN/
当然,一定是不能忘记工具中自带的帮助资料,据目前我的了解,这是最全面和权威的。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我将利用空闲时间翻译和总结Tcl/Tk的资料,希望在这块领域中互相学习和交流
有错误的地方,希望大家及时和我联系
作者: Missparad
Email: dujj@emails.bjut.edu.cn
2005年4月
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

TCL重要命令学习笔记(dujj

1.         variable 创造和初始化一个名字空间变量

语法variable ?name value...? name ?value?

描述:该命令通常用于eval命令中,创造一个或多个名字空间变量。变量名被值(value)初始化,但是最后一个变量的值是可选的。

如果名字前面有名字作用域定义子,则变量在指定的名字空间上创建。如果变量没有被定义,它可以被which命令来显示,但不能由info exists来显示。

如果variable命令再TCL过程中被执行,他将创造一个本地变量联系到相应的名字空间变量(因而这些变量可以用这个命令info locals来列举)。在这种方式下,variable命令重组了这个全局命令global,然而,global 命令紧紧联系到全局名字空间的变量上,如果,对于既定的任何变量,他们通常修改乡两系的名字空间变量的值。如果名字空间变量不存在,他将被创造并且被任意的初始化。

一个名字参数不能引用数aa组中的一个成员,相反,名字应该引用整个数组,并且初始化值应该留空。在变量在被申明以后数组中的成员可以使用通常的命令;set 或者array来设置值。

2  upvar -在不同的栈框架下创建变量连接

语法upvar ?level? otherVar myVar ?otherVar myVar ...?

描述:这个命令排列当前程序中的一个或多个局域变量来引用在enclosing 过程调用的变量或者是全局变量。Uplevel命令允许level采用任何形式,如果第一个otherVar参数的第一个字母不是#或者数字(默认为1),则level可以被忽略。对每一个otherVar自变量,upvar根据相应的myVar参数所在的当前过程所取得的level(或者在全局level,如果level#0)所指定的过程框架中创建该变量。由otherVar所命名的变量并不必要求在调用的整个期间存在;他将在第一次myVar被引用的时候象普通变量那样被创造。在upvar被激活的时候就决不会存在一个myVar名字的变量。MyVar总是被作为一个变量名字存在,而不是作为一个数组元素,即令这个名字看起来像是一个数组元素,例如a(b),一个传统的变量被创造。OtherVar可能引用导一个scalar变量,一个数组,或者一个数组元素。Upvar返回一个空字符串。

Upvar命令简化了名字调用过程(call-by-name procedure)并且使他能够创建新的Tcl过程控制结构 ,如下面的过程:

proc add2 name {

   upvar $name x

   set x [expr $x+2]

}

名字空间 eval 是另外一个(包括过程调用)导致Tcl名字上下文被改变的0方法。他加入一个调用框架(call frame)到表示名字空间上下文的堆栈。这意味每一个名字空间eval命令被算作另外一个uplevelupvar命令的调用级别(call level)。例如,info level 1 将返回一个描述命令的列表,其中或者是是外部最高层的过程调用,或者是外部最高层的(outermost)的名字空间eval命令。另外,uplevel #0 评价一个在最外部名字空间(全局名字空间)上的top-level的脚本。

如果upvar变量被unset,这个unset操作影响到他联系到的变量,而不是upvar变量。没有方法能够unset一个upvar变量,除非是结束(exit)其定义所在的过程。

3. eval – 对一段 Tcl 脚本求值

语法eval arg ?arg ...?

描述Eval 带一个或者多个参数,这些参数由一个包含一个或多个命令个Tcl脚本组成。 Eval 以一种象concat命令风格的方式将他所有的参数串连在一起,然后循环地将该连接好的字符串传递到Tcl解释器,如果没有错误发生则返回计算结果。注意:list命令是在不再被eval命令展开的方式下引用单词序列(the list command quotes sequences of words in such a way that they are not further expanded by the eval command.

 

4. uplevel – 在不同的堆栈框架下执行脚本

语法uplevel ?level? arg ?arg ...?

描述:所有的参数像是传递给concat一样被连接起来;然后结果在level所指定的变量上下文被计算。Uplevel 返回计算结果

如果level为整数,则表示在执行命令前移动一段距离(到过程调用堆栈)。如果level包含 # 加一个数字,那么该数字表示一个绝对的level数。如果level被忽略则默认为1。但是当第一个命令参数是以一个数字或者#开始,level不能默认设置

例如,假定过程atop-level被激活,并且被b调用,然后bc调用。假定c激活uplevel命令。如果是1或者#2level被忽略,那么命令将在b的变量上下文被执行。如果level2 or #1 ,那么命令将在a的变量上下文被执行。在如果level3 or #0 ,那么命令将在top-level 被执行,这时仅仅全局变量是可见的。

    Uplevel命令导致命令执行的时候正在激活的过程从调用堆栈的过程中消失。以上面的例子为例,假定c调用命令

uplevel 1 {set x 43; d}

这里d是另外一个Tcl过程。该set命令将在b的上下文修改x变量,并且d将在level 3上执行,就好像被b调用一样。如果d相应的执行命令

uplevel {set x 42}

那么该set命令将修改b上下文中同样的变量x:当d被执行的时候,过程c并不出现在调用堆栈上。info level 可以用来获得当前过程的level

Uplevel 使得应用新的Tcl过程控制结构成为可能。 (for example, uplevel could be used to implement the while construct as a Tcl procedure).

namespace eval 是另外一种导致Tcl命名上下文被改变的方法。这意味着每一个namespace eval 命令作为uplevelupvar命令的调用level被计算。例如, info level 1 将返回一个描述命令的列表,其中或者是是外部最高层的过程调用,或者是外部最高层的(outermost)的名字空间eval命令。另外,uplevel #0 评价一个在最外部名字空间(全局名字空间)上的top-level的脚本。

5. update – 处理未决事件和空闲回调(pending events and idle callbacks

语法:update ?idletasks?

描述:该命令用于使应用程序更新(up to date)。方法是反复切入事件循环直到所有的未决事件(包括空闲的回调)被处理

如果idletasks 关键字被指定为一个命令参数,那么不处理新的事件和错误,仅仅激活空闲回调。这通常导致正常的延期操作,比如显示更新和窗口布局计算。

update idletasks 在那些应用程序的状态已经改变并且你希望这些改变立即被显示出来而不用等到脚本结束的脚本中是非常有用的。大多数显示更新是作为空闲回调被执行的,因而update idletasks 将导致他们运行起来。然而,有几种更新仅仅响应相应的事件,例如窗口尺寸变化,update idletasks将不会导致显示更新。

无选项的update 命令一些脚本中是有用的,比如脚本正在执行一段长时间的计算,而这时候你希望应用程序能够对用户交互行为作出响应,如果你偶尔调用update,那么用户输入将在下一次update调用这段期间被执行。


posted on 2005-04-22 21:12  迷失天堂  阅读(1419)  评论(0编辑  收藏  举报