TCL编程高级教程.ppt

上传人:牧羊曲112 文档编号:5450386 上传时间:2023-07-08 格式:PPT 页数:55 大小:478.50KB
返回 下载 相关 举报
TCL编程高级教程.ppt_第1页
第1页 / 共55页
TCL编程高级教程.ppt_第2页
第2页 / 共55页
TCL编程高级教程.ppt_第3页
第3页 / 共55页
TCL编程高级教程.ppt_第4页
第4页 / 共55页
TCL编程高级教程.ppt_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《TCL编程高级教程.ppt》由会员分享,可在线阅读,更多相关《TCL编程高级教程.ppt(55页珍藏版)》请在三一办公上搜索。

1、TCL编程高级教程,测试平台开发部 周健明 04245,培训内容,命名空间脚本库和程序包ITCL,命名空间,命名空间的基本概念命名空间概念定义命名空间示例限定命名名称解析输入命令输出命令命名空间的命令参考,命名空间,命名空间的基本概念 命名空间是一个命令与变量的集合。命名空间把命令和变量封装起来以确保它们不会干扰别的命名空间中的命令和变量。TCL已经有一个这样的集合,就是我们指的全局命名空间。全局命名空间将所有的全局变量和命令放在一起。命名空间也叫做名称空间、名称域、命名域 等。,命名空间,命名空间创建:用 namespace eval 命令创建一个新的命名空间命名空间查询 如果要在命名空间X

2、XX之外查询命名空间内部变量的值xxx,可以用如下语句:set:XXX:xxx,命名空间,命名空间示例1:用 namespace eval 命令创建一个新的命名空间:namespace eval Counter namespace export bump variable num 0 proc bump variable num incr num set:Counter:num:Counter:bump,命名空间,命名空间示例2:命名空间是动态的。你可以在任何时候添加、删除命令和变量:namespace eval Counter variable num 0 proc bump variabl

3、e num return incr num,命名空间,命名空间示例2:命名空间是动态的。你可以在任何时候添加、删除命令和变量:namespace eval Counter proc test args return$args namespace eval Counter rename test test过程先被加到Counter命名空间中,稍后又被rename命令移除了,命名空间,命名空间示例3:命名空间里面可以拥有其它的命名空间形成一个嵌套的分层目录结构。namespace eval Foo variable fooVar 0.namespace eval Counter namespace

4、 export bump variable num 0 proc bump variable num incr num,命名空间,命名空间示例3:现在如果在Foo之外访问num就要把Foo也加入到限定命名中:set:Foo:Counter:num 而在Foo内部访问num就只需要用:set Counter:num set:Foo:Counter:num,命名空间,限定命名 限定命名又叫限定名称、资格命名或资格名称,英文原名为qualified names 每一个命名空间有一个原始的名称诸如histroy或:safe:interp。由于命名空间可能嵌套,限定命名被用来表示命令、变量、子命名空间。

5、限定命名跟Unix的路径或TK部件(widgets)的分层目录结构类似,只是命名空间的限定命名使用:作为分隔符而不是/或.而已。最顶层或全局的命名空间的名称是空(如:空字符串),在形式上与:同义。如果你想访问另一个命名空间中的命令和变量,你必须使用额外的语法结构,使用命名空间的限定命名。,命名空间,限定命名 除了全局命名空间外,命名空间的命名都不为空。除了作为命名空间的分隔符外,:也不被简单的命令、变量、命名空间命名接受。在限定命名尾部的:表示该命名空间变量或命令的命名是,因此在限定命名空间名称尾部的:会被忽略。另外,在限定命名中单个的:将被看作单个的字符,而2个或更多的单个:将被当作一个命名

6、空间分隔符看待。例如:namespace eval:aa:bb:cc set x 100;#定义命名空间:aa:bb:cc中的变量x set:aa:bb:cc:x;#查询x的值,将返回100 set:aa:bb:cc:x;#也返回100,b与c之间的3个:,c与x之间的4个:都被当作一个:看待 set:aa:bb:c:x;#将出错,因为b与c之间的1个:被当作普通的字符看待,但并没有定义:a:bb这样的命名空间,所以要小心!:aa:bb表示的是命名空间aa下的命名空间bb,而:aa:bb表示的是命名空间aa:bb。,命名空间,名称解析 一般来说,所有的TCL命令都支持变量和命令的限定命名。也就

7、是说你可以在 set、proc、rename、interp alias 等命令中使用限定命名。如果你提供以:开头的完整限定命名,则可以精确地找到你指的命令、变量或命名空间。,命名空间,名称解析 如果命名不是以:开头的,则意味着相对路径的命名,TCL提供如下的名称解析策略:首先在当前命名空间中查找,如果没有才在全局命名空间查找。如果在当前命名空间和全局命名空间都没找到,则该命名尚未定义。例1:set traceLevel 0 namespace eval Debug printTrace$traceLevel TCL首先在命名空间Debug中查找traceLevel,然后是全局命名空间。,命名空

8、间,名称解析 例2:set traceLevel 0 namespace eval Foo variable traceLevel 3 namespace eval Debug printTrace$traceLevel TCL首先在命名空间 Foo:Debug 中查找 traceLevel,因为没找到,所以就到全局命名空间中查找。在命名空间Foo中定义的变量 Foo:traceLevel 既不是当前命名空间Foo:Debug中的变量,也不是全局命名空间中的变量,因此在名称解析的过程中被完全忽略了。,命名空间,输入命令和输出命令 命名空间常常用来描述库,需要频繁使用命名空间前缀,用输入命令和输

9、出命令可以省略命令前面的命名空间前缀。输入命令:namespace import 输出命令:namespace export,命名空间,输入命令 namespace import 命令只输入命名空间中用namespace export命令输出的命令如果不再需要使用已经输入的命令,可以使用namespace forget 示例:namespace import Blt:graph Blt:table 就只输入graph和table命令到当前上下文中。用namespace forget命令来移除:namespace forget Blt:*。当你在输出命名空间中删除一个命令时(如:rename B

10、lt:graph),该命令也自动从所有输入它的命名空间中移除。,命名空间,输出命令 在命令空间中输出命令,用namespace export命令声明要输出的命令:namespace export xxx namespace export 命令指明了哪些命令可以被其他命名空间输入。namespace import 命令只输入那些在命名空间中明确定义为输出的命令。如果namespace import命令指定了一个没有输出的命令,该命令不会被输入。,命名空间,命名空间的命令参考:namespace命令:命令与变量的上下文创建和维护是通过namespace命令来进行的 命名空间的创建和删除 命名空间的

11、环境抓取和脚本执行 命名空间的输入和输出 命名空间信息查询 限定命名操作,命名空间,命名空间的其他相关命令:variable命令:variable命令用于创建和初始化一个命名空间的变量 glob-style(glob样式):glob本身是使用通配符查找符合特定pattern的文件名的命令,而glob-style(样式)的就是指使用与glob语法相同的通配符进行模糊查找的匹配方式。,培训内容,命名空间脚本库和程序包ITCL,脚本库和程序包,脚本库 什么是脚本库创建和调用脚本库 脚本库的优缺点 程序包 什么是程序包创建程序包索引文件pkgIndex.tcl 使用程序包 与脚本库和程序包相关的全局变

12、量和过程,脚本库和程序包,脚本库 Q:什么是脚本库?A:TCL中提供了Library来存放一些有用的TCL过程的集合,就是脚本库。使用脚本库的好处是应用程序可以由一个较短的主程序、一个或多个支持库组成,这样应用程序加载时只加载主程序,而支持库中的过程会在使用时才加载,可以缩短整个应用程序的加载时间。脚本库的另一个好处是可以供多个应用程序使用,这样也可以提高程序的共享和复用。另外,脚本库还提供自动加载机制。,脚本库和程序包,创建脚本库:STEP:创建脚本库只需以下两步:第一,创建脚本文件。第二步,为自动加载创建索引文件。在TCL解释器(如tclsh或wish)中,执行命令:auto_mkinde

13、x.,脚本库和程序包,调用脚本库:在脚本库及其tclIndex文件被创建后,只需要把脚本库的路径添加到TCL的全局变量 auto_path 中即可,以后就可以自由引用脚本库中的过程。TCL会自动搜索 auto_path 每个路径下的 tclIndex 文件来确定要调用的过程在哪里。一般使用 lappend 命令将路径添加到 auto_path 中,例如:%lappend auto_path c:/tcllib/lib1 C:/DEVELOP/TCL/lib/tcl8.3 C:/DEVELOP/TCL/lib C:/DEVELOP/TCL/lib/tk8.3 c:/tcllib/lib1 如果一

14、个函数在几个脚本库中都有定义的话,TCL会按照搜索顺序自动加载在 auto_path 中位置靠前的那个库。因此,如果加载的脚本库要先被搜索的话,可以使用 linsert 命令将其插入到 auto_path 中靠前的位置中,例如:%set auto_path linsert$auto_path 0 c:/tcllib/lib1 c:/tcllib/lib1 C:/DEVELOP/TCL/lib/tcl8.3 C:/DEVELOP/TCL/lib C:/DEVELOP/TCL/lib/tk8.3,脚本库和程序包,脚本库的优缺点优点:脚本库的方法从TCL 的最早版本开始就支持,不存在兼容性问题,很多

15、现有的公共脚本就是使用脚本库创建的。由于通过把路径添加到 auto_path 变量中来实现对脚本库的定位,因此脚本库可以存放在任何位置,没有路径限制。缺点:不支持版本号,不便于脚本库的更新和维护。由于脚本库只能用TCL语言编写,能够实现的功能有限。另外,每个脚本库的路径都要添加到 auto_path 变量中也比较烦琐。为解决上述问题和进一步提高TCL 的扩展能力,较新版本的TCL提供了更好的程序包机制。,脚本库和程序包,程序包Q:什么是程序包?A:由于脚本库的局限性,TCL提供了更好的 package 机制来实现对TCL的共用和扩展,也就是程序包。,脚本库和程序包,创建TCL程序包:把你想包含

16、在某个包中的所有自定义过程放到一个TCL脚本文件中,然后在文件的开头使用 package provide 命令指明这个包的名字和版本即可。,脚本库和程序包,创建二进制程序包:用TCL编写的程序包,功能仍然有限,因此TCL还特别支持二进制程序包。这样,就可以用C/C+语言编写TCL扩展命令了,充分利用Windows或UNIX系统提供的强大 API 功能。二进制程序包实际上就是由系统平台所支持的编译后的可执行代码共享库。根据当前系统平台的不同,二进制程序包的文件后缀也不一样。在 UNIX 上二进制程序包的后缀是.so,在 Macintosh 上是.shlib,而在 Windows 上就是我们所熟悉

17、的动态连接库.dll。,脚本库和程序包,索引文件 pkgIndex.tcl生成索引文件 pkgIndex.tcl自动生成 pkgIndex.tcl 文件的命令:pkg_mkIndex。pkg_mkIndex-lazy-load-verbose.,脚本库和程序包,如何使用程序包:使用某一个程序包时,可以调用 package require 命令,该命令对TCL和二进制的程序包都适用。命令格式:package require-exact 参数 name 是程序包的名字,也就是在 TCL中用 package provide 命令、在 DLL 中用 Tcl_PkgProvide 函数指定的名称。参数

18、version 是版本号,格式为 major.minor,其中major 是主版本号,minor是次版本号,两者用小数点隔开。如果省略version,则加载当前能找到了名称叫 name 的程序包中版本最高的那一个,否则加载相同 major 版本的最高 minor 版本;如果使用-exact 选项。在书写名称时要注意与程序包中的声明一致,尤其是字母大小写。,脚本库和程序包,与脚本库和程序包相关的全局变量和过程auto_path变量:保存Tcl 脚本库/程序包的搜索路径。tcl_library变量:存放着默认的库目录。auto_index数组:auto_index是一个TCL数组(array),指

19、明哪个命令在哪个tcl脚本里的对应关系。tclPkgUnknown过程:对于auto_index里没有指明的命令,TCL会调用tclPkgUnknown过程来查找。unknown过程:对于auto_index里没有指明的命令,TCL会调用tclPkgUnknown过程来查找。init.tcl 文件:Tcl控制台外壳利用init.tcl初始化它自身。,培训内容,命名空间脚本库和程序包ITCL,ITCL,ITCL简介类和对象变量和方法接口和实现的分离public、protected、private通用变量和过程重用:继承重用:合成类的固有(build-in)方法ITCL和C扩展,ITCL,ITCL

20、简介ITCL是INCR TCL的缩写,也称TCL+,是TCL的一个重要扩展,并和TCL完全兼容。ITCL支持面向对象的程序设计。面向对象的编程可以提高软件重用的程度和效率,改善程序结构,这也是我们引入ITCL的原因。,ITCL,类和对象变量和方法在ITCL中,使用class命令可以定义一个新类,类里面可以定义变量和方法,这里的变量和方法对应于C+中类的成员变量和成员函数。定义变量使用variable命令,这和名字空间中一样。定义方法使用method命令。,ITCL,实例一:ITCL中定义的一个类MyRand,其中的黑体字是关键字。class MyRand variable seed clock

21、 secondsvariable min 0variable max 100constructor low high puts The constructor of MyRand is called,create object$thisset min$lowset max$highdestructor puts The destructor of MyRand is called,delete object$thismethod srand set seed clock seconds,ITCL,method rand srand return expr$min+$seed%($max-$mi

22、n)method setrange min max set min$minset max$maxmethod getrange options switch-$options-min return$min-max return$max error bad option$options,ITCL,类和对象变量和方法constructor和destructor命令用于生成类的构造函数和析构函数,和C+一样,构造函数在生成对象时自动调用,析构函数在销毁对象时自动调用,和C+一样,ITCL的类的构造函数和析构函数是可以缺省的。,ITCL,类和对象接口和实现的分离在ITCL中,方法的声明和方法的实现是可

23、以分离的,方法体不必写在ITCL的类的声明中使用body命令可以在类的外部定义方法体,因为是在类的定义的外部,所以需要使用限定名,由于构造函数和析构函数的定义和别的方法不一样,它们的函数体必须在类的定义中,不过你可以在类的定义中定义一个空体,然后利用body命令在外面重新定义函数体。类的声明和实现分离,有助于实现交互式开发,ITCL,实例二:class MyRand variable seed clock secondsvariable min 0variable max 100constructor low high puts The constructor of MyRand is cal

24、led,create object$thisset min$lowset max$highdestructor puts The destructor of MyRand is called,delete object$thismethod srand method rand method setrange min max method getrange options,ITCL,实例二:body MyRand:srand set seed clock secondsbody MyRand:rand srand return expr$min+$seed%($max-$min)body MyR

25、and:setrange min max set min$minset max$maxbody MyRand:getrange options switch-$options-min return$min-max return$max error bad option$options,ITCL,类和对象public、protected、privatepublic类型的变量和方法可以在类的外部被访问,并且可以被子类继承;private和protected类型的变量和方法则只能在类内部被访问,protected类型的变量和方法与private类型的变量和方法的区别在于:前者可以被子类继承,后者则不

26、能。缺省情况下,类中的变量为private,方法为publicITCL中的每个类都有两个build-in方法:configure和cget,configure方法用来设置对象的属性,而cget则用来获取对象的属性。,ITCL,类和对象通用变量和过程在C+中,有一类成员变量,它不属于任何一个特定对象,但是却被类的所有对象共享,这种变量被称为静态数据成员。在ITCL中,也提供类似的变量,不过被称为通用变量(common variable)。在C+中,有一类成员函数属于整个类,可以脱离类的实例而存在,被称为静态成员函数。ITCL中提供了类似的功能,不过被称为过程(procedure),可以用proc

27、命令来声明,一个过程属于整个类,它可以在生成类的实例之前使用。,ITCL,实例三:class MyRand private variable seed clock secondspublic variable min 0public variable max 100private common counter constructor args puts The constructor of MyRand is called,create object$thisif!info exists counter set counter 0eval configure$argsincr counterd

28、estructor puts The destructor of MyRand is called,delete object$thisincr counter-1private method srand public method rand proc getcounter,ITCL,实例三:body MyRand:srand set seed clock secondsbody MyRand:rand srand return expr$min+$seed%($max-$min)body MyRand:getcounter return$counter对于通用变量和过程,可以直接使用限定名或

29、完全限定名引用:%set MyRand:counter 00%MyRand:getcounter0,ITCL,类和对象重用:继承单重继承:public和protected类型的变量和方法可以被子类继承;private类型的变量和方法则不能被子类继承,父类中方法可以在子类中进行重载。多重继承:ITCL也提供多重继承的机制 每个类只能有一个inherit语句,不过可以声明多个基类。注意基类必须按重要程度的先后排列,因为如果两个基类具有相同名字的方法的话,在inherit中排在前面的类的方法将被优先继承。,ITCL,继承只需要在派生类中用inherit命令声明从哪个类继承就可以了。实例四:class

30、 person public variable id protected variable age constructor idvar agevar set id$idvar set age$agevarpublic method live public method energy private method food,ITCL,实例四:body person:live energyputs class person,method live is calledbody person:energy food puts class person,method energy is calledbo

31、dy person:food puts class person,method food is called,ITCL,实例四:class robot inherit personpublic variable owner constructor idvar agevar args person:constructor$idvar$agevar eval configure$argspublic method energy private method eletricity body robot:energy eletricityputs class robot,method energy i

32、s calledbody robot:eletricity puts class robot,method eletricity is called,ITCL,类和对象重用:合成 和继承相对,C+中重用一个类的代码的另一种方法是合成,即在一个类中包含另一个类的对象,继承是一种 is-a 关系,而合成是 has-a 关系。ITCL中也一样可以使用合成。,ITCL,类和对象类的固有(build-in)方法 我们每定义一个ITCL的类,ITCL会自动为我们的类添加几个固有的方法,前面已经介绍的有configure和cget,这里就不再介绍,另外两个就是isa方法和info方法。,ITCL,ITCL和C扩展 ITCL支持扩展,这里介绍两种情况:类中的方法使用C/C+实现,把类对象作为扩展命令的参数。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号