TCL编程高级教程实用教案_第1页
TCL编程高级教程实用教案_第2页
TCL编程高级教程实用教案_第3页
TCL编程高级教程实用教案_第4页
TCL编程高级教程实用教案_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、培训培训(pixn)内容内容 命名空间(kngjin) 脚本库和程序包 ITCL第1页/共55页第一页,共56页。命名(mng mng)空间 命名空间的基本概念 命名空间概念定义 命名空间示例 限定命名 名称解析 输入(shr)命令 输出命令 命名空间的命令参考第2页/共55页第二页,共56页。命名(mng mng)空间 命名空间的基本概念 命名空间是一个命令与变量的集合。命名空间把命令和变量封装起来以确保它们不会干扰别的命名空间中的命令和变量。 TCL已经有一个这样(zhyng)的集合,就是我们指的全局命名空间。全局命名空间将所有的全局变量和命令放在一起。 命名空间也叫做名称空间、名称域、命

2、名域 等。第3页/共55页第三页,共56页。命名(mng mng)空间 命名空间创建: 用 namespace eval 命令创建一个新的命名空间 命名空间查询 如果要在命名空间XXX之外查询命名空间内部(nib)变量的值xxx,可以用如下语句: set : XXX:xxx 第4页/共55页第四页,共56页。命名(mng mng)空间 命名(mng mng)空间示例1: 用 namespace eval 命令创建一个新的命名(mng mng)空间: namespace eval Counter namespace export bump variable num 0 proc bump var

3、iable num incr num set :Counter:num :Counter:bump 第5页/共55页第五页,共56页。命名(mng mng)空间 命名空间示例2: 命名空间是动态的。你可以(ky)在任何时候添加、删除命令和变量 : namespace eval Counter variable num 0 proc bump variable num return incr num 第6页/共55页第六页,共56页。命名(mng mng)空间 命名空间示例2: 命名空间是动态的。你可以在任何时候添加、删除命令和变量(binling) : namespace eval Count

4、er proc test args return $args namespace eval Counter rename test test过程先被加到Counter命名空间中,稍后又被rename命令移除了 第7页/共55页第七页,共56页。命名(mng mng)空间 命名空间示例3: 命名空间里面可以拥有(yngyu)其它的命名空间形成一个嵌套的分层目录结构。 namespace eval Foo variable fooVar 0 . namespace eval Counter namespace export bump variable num 0 proc bump variabl

5、e num incr num 第8页/共55页第八页,共56页。命名(mng mng)空间 命名(mng mng)空间示例3: 现在如果在Foo之外访问num就要把Foo也加入到限定命名(mng mng)中: set :Foo:Counter:num 而在Foo内部访问num就只需要用: set Counter:num set :Foo:Counter:num 第9页/共55页第九页,共56页。命名(mng mng)空间 限定命名 限定命名又叫限定名称、资格命名或资格名称,英文原名为qualified names 每一个命名空间有一个原始的名称诸如histroy或:safe:interp。由于

6、命名空间可能嵌套,限定命名被用来表示命令、变量、子命名空间。限定命名跟Unix的路径或TK部件(widgets)的分层目录结构类似,只是命名空间的限定命名使用:作为分隔符而不是 / 或 . 而已(r y)。 最顶层或全局的命名空间的名称是空(如:空字符串),在形式上与 : 同义。 如果你想访问另一个命名空间中的命令和变量,你必须使用额外的语法结构,使用命名空间的限定命名。 第10页/共55页第十页,共56页。命名(mng mng)空间限定命名 除了全局命名空间外,命名空间的命名都不为空。除了作为命名空间的分隔符外,:也不被简单的命令、变量、命名空间命名接受(jishu)。在限定命名尾部的:表示

7、该命名空间变量或命令的命名是,因此在限定命名空间名称尾部的 : 会被忽略。另外,在限定命名中单个的 : 将被看作单个的字符,而2个或更多的单个 : 将被当作一个命名空间分隔符看待。例如: 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这样的命名空间,

8、所以要小心!:aa:bb表示的是命名空间aa下的命名空间bb ,而:aa:bb表示的是命名空间aa:bb 。 第11页/共55页第十一页,共56页。命名(mng mng)空间名称解析 一般来说,所有的TCL命令都支持变量和命令的限定命名。也就是说你可以在 set 、proc、rename、interp alias 等命令中使用限定命名。如果你提供(tgng)以:开头的完整限定命名,则可以精确地找到你指的命令、变量或命名空间。第12页/共55页第十二页,共56页。命名(mng mng)空间名称解析 如果命名不是以 : 开头(ki tu)的,则意味着相对路径的命名,TCL提供如下的名称解析策略:首

9、先在当前命名空间中查找,如果没有才在全局命名空间查找。如果在当前命名空间和全局命名空间都没找到,则该命名尚未定义。例1: set traceLevel 0 namespace eval Debug printTrace $traceLevel TCL首先在命名空间Debug中查找traceLevel,然后是全局命名空间。第13页/共55页第十三页,共56页。命名(mng mng)空间 名称解析 例2: set traceLevel 0 namespace eval Foo variable traceLevel 3 namespace eval Debug printTrace $traceL

10、evel TCL首先在命名空间 Foo:Debug 中查找 traceLevel ,因为没找到,所以就到全局命名空间中查找。在命名空间Foo中定义的变量 Foo:traceLevel 既不是(b shi)当前命名空间Foo:Debug中的变量,也不是(b shi)全局命名空间中的变量,因此在名称解析的过程中被完全忽略了。 第14页/共55页第十四页,共56页。命名(mng mng)空间输入命令和输出命令 命名(mng mng)空间常常用来描述库,需要频繁使用命名(mng mng)空间前缀,用输入命令和输出命令可以省略命令前面的命名(mng mng)空间前缀。 输入命令: namespace i

11、mport 输出命令: namespace export第15页/共55页第十五页,共56页。命名(mng mng)空间 输入命令 namespace import 命令只输入命名空间中用namespace export命令输出的命令 如果不再需要使用已经输入的命令,可以使用namespace forget 示例: namespace import Blt:graph Blt:table 就只输入graph和table命令到当前(dngqin)上下文中。 用namespace forget命令来移除: namespace forget Blt:* 。 当你在输出命名空间中删除一个命令时(如:r

12、ename Blt:graph ),该命令也自动从所有输入它的命名空间中移除。 第16页/共55页第十六页,共56页。命名(mng mng)空间 输出命令 在命令空间中输出命令,用namespace export命令声明要输出的命令: namespace export xxx namespace export 命令指明了哪些命令可以(ky)被其他命名空间输入。namespace import 命令只输入那些在命名空间中明确定义为输出的命令。如果namespace import命令指定了一个没有输出的命令,该命令不会被输入 。 第17页/共55页第十七页,共56页。命名(mng mng)空间 命

13、名空间的命令参考: namespace命令 :命令与变量(binling)的上下文创建和维护是通过namespace命令来进行的 命名空间的创建和删除 命名空间的环境抓取和脚本执行 命名空间的输入和输出 命名空间信息查询 限定命名操作第18页/共55页第十八页,共56页。命名(mng mng)空间 命名空间的其他相关命令: variable命令 :variable命令用于创建和初始化一个命名空间的变量 glob-style (glob样式) :glob本身是使用通配符查找符合(fh)特定pattern的文件名的命令,而glob-style(样式)的就是指使用与glob语法相同的通配符进行模糊查

14、找的匹配方式。 第19页/共55页第十九页,共56页。培训培训(pixn)内容内容 命名空间(kngjin) 脚本库和程序包 ITCL第20页/共55页第二十页,共56页。脚本(jiobn)库和程序包 脚本库 什么是脚本库 创建和调用脚本库 脚本库的优缺点 程序包 什么是程序包 创建程序包 索引文件pkgIndex.tcl 使用(shyng)程序包 与脚本库和程序包相关的全局变量和过程 第21页/共55页第二十一页,共56页。脚本(jiobn)库和程序包 脚本库 Q:什么是脚本库? A:TCL中提供了Library来存放一些有用的TCL过程的集合,就是脚本库。 使用脚本库的好处是应用程序可以由

15、一个较短的主程序、一个或多个支持库组成,这样应用程序加载时只加载主程序,而支持库中的过程会在使用时才加载,可以缩短整个应用程序的加载时间。 脚本库的另一个好处是可以供多个应用程序使用,这样也可以提高程序的共享和复用(f yn)。 另外,脚本库还提供自动加载机制。第22页/共55页第二十二页,共56页。脚本(jiobn)库和程序包 创建脚本库: STEP:创建脚本库只需以下两步: 第一,创建脚本文件。 第二步,为自动(zdng)加载创建索引文件。 在TCL解释器(如tclsh或wish)中,执行命令: auto_mkindex . 第23页/共55页第二十三页,共56页。脚本(jiobn)库和程

16、序包 调用脚本库: 在脚本库及其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 如果一个函

17、数在几个脚本库中都有定义的话,TCL会按照(nzho)搜索顺序自动加载在 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 第24页/共55页第二十四页,共56页。脚本(jiobn)库和程序包 脚本库的优缺点

18、优点:脚本库的方法从TCL 的最早版本开始就支持,不存在兼容性问题,很多现有的公共脚本就是使用脚本库创建的。由于通过把路径添加到 auto_path 变量中来实现对脚本库的定位,因此脚本库可以存放在任何位置,没有(mi yu)路径限制。 缺点:不支持版本号,不便于脚本库的更新和维护。由于脚本库只能用TCL语言编写,能够实现的功能有限。另外,每个脚本库的路径都要添加到 auto_path 变量中也比较烦琐。 为解决上述问题和进一步提高TCL 的扩展能力,较新版本的TCL提供了更好的程序包机制。 第25页/共55页第二十五页,共56页。脚本(jiobn)库和程序包 程序包 Q:什么(shn me)

19、是程序包? A:由于脚本库的局限性,TCL提供了更好的 package 机制来实现对TCL的共用和扩展,也就是程序包 。 第26页/共55页第二十六页,共56页。脚本(jiobn)库和程序包 创建TCL程序包: 把你想包含(bohn)在某个包中的所有自定义过程放到一个TCL脚本文件中,然后在文件的开头使用 package provide 命令指明这个包的名字和版本即可。 第27页/共55页第二十七页,共56页。脚本(jiobn)库和程序包 创建二进制程序包 : 用TCL编写的程序包,功能仍然有限,因此TCL还特别支持二进制程序包。这样,就可以用C/C+语言编写TCL扩展命令了,充分利用Wind

20、ows或UNIX系统提供的强大 API 功能。 二进制程序包实际上就是由系统平台(pngti)所支持的编译后的可执行代码共享库。根据当前系统平台(pngti)的不同,二进制程序包的文件后缀也不一样。在 UNIX 上二进制程序包的后缀是 .so ,在 Macintosh 上是 .shlib ,而在 Windows 上就是我们所熟悉的动态连接库 .dll 。 第28页/共55页第二十八页,共56页。脚本(jiobn)库和程序包 索引文件(wnjin) pkgIndex.tcl 生成索引文件(wnjin) pkgIndex.tcl 自动生成 pkgIndex.tcl 文件(wnjin)的命令: pk

21、g_mkIndex 。 pkg_mkIndex -lazy -load -verbose . 第29页/共55页第二十九页,共56页。脚本(jiobn)库和程序包 如何使用程序包: 使用某一个程序包时,可以调用 package require 命令,该命令对TCL和二进制的程序包都适用。 命令格式: package require -exact 参数 name 是程序包的名字,也就是在 TCL中用(zhngyng) package provide 命令、在 DLL 中用(zhngyng) Tcl_PkgProvide 函数指定的名称。 参数 version 是版本号,格式为 major.min

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

23、L数组(array),指明哪个命令在哪个tcl脚本里的对应关系 。 tclPkgUnknown过程:对于auto_index里没有指明的命令,TCL会调用(dioyng)tclPkgUnknown过程来查找 。 unknown过程:对于auto_index里没有指明的命令,TCL会调用(dioyng)tclPkgUnknown过程来查找 。 init.tcl 文件:Tcl控制台外壳利用init.tcl初始化它自身 。 第31页/共55页第三十一页,共56页。培训培训(pixn)内容内容 命名(mng mng)空间 脚本库和程序包 ITCL第32页/共55页第三十二页,共56页。ITCL ITC

24、L简介 类和对象 变量(binling)和方法 接口和实现的分离 public、protected、private 通用变量(binling)和过程 重用:继承 重用:合成 类的固有(build-in)方法 ITCL和C扩展第33页/共55页第三十三页,共56页。ITCLITCL简介ITCL是INCR TCL的缩写,也称TCL+,是TCL的一个重要扩展,并和TCL完全兼容。ITCL支持面向对象的程序设计。 面向对象的编程可以提高软件重用的程度和效率,改善(gishn)程序结构,这也是我们引入ITCL的原因。第34页/共55页第三十四页,共56页。ITCL 类和对象 变量和方法 在ITCL中,使

25、用class命令可以定义一个新类,类里面可以定义变量和方法,这里(zhl)的变量和方法对应于C+中类的成员变量和成员函数。 定义变量使用variable命令,这和名字空间中一样。定义方法使用method命令。第35页/共55页第三十五页,共56页。ITCL 实例一:ITCL中定义的一个(y )类MyRand,其中的黑体字是关键字。 class MyRand variable seed clock seconds variable min 0 variable max 100 constructor low high puts The constructor of MyRand is calle

26、d ,create object $thisset min $lowset max $high destructor puts The destructor of MyRand is called ,delete object $this method srand set seed clock seconds第36页/共55页第三十六页,共56页。ITCLmethod rand srand return expr $min+$seed%($max-$min) method setrange min max set min $minset max $maxmethod getrange opti

27、ons switch - $options -min return $min -max return $max error bad option$options第37页/共55页第三十七页,共56页。ITCL 类和对象(duxing) 变量和方法 constructor和destructor命令用于生成类的构造函数和析构函数,和C+一样,构造函数在生成对象(duxing)时自动调用,析构函数在销毁对象(duxing)时自动调用,和C+一样,ITCL的类的构造函数和析构函数是可以缺省的。第38页/共55页第三十八页,共56页。ITCL 类和对象 接口和实现(shxin)的分离 在ITCL中,方法

28、的声明和方法的实现(shxin)是可以分离的,方法体不必写在ITCL的类的声明中 使用body命令可以在类的外部定义方法体,因为是在类的定义的外部,所以需要使用限定名, 由于构造函数和析构函数的定义和别的方法不一样,它们的函数体必须在类的定义中,不过你可以在类的定义中定义一个空体,然后利用body命令在外面重新定义函数体。 类的声明和实现(shxin)分离,有助于实现(shxin)交互式开发第39页/共55页第三十九页,共56页。ITCL实例(shl)二:class MyRand variable seed clock secondsvariable min 0variable max 100

29、constructor 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 method rand method setrange min max method getrange options 第40页/共55页第四十页,共56页。ITCL实例(shl)二:body MyRand:srand

30、 set seed clock secondsbody MyRand:rand srand return expr $min+$seed%($max-$min)body MyRand:setrange min max set min $minset max $maxbody MyRand:getrange options switch - $options -min return $min -max return $max error bad option$options第41页/共55页第四十一页,共56页。ITCL 类和对象 public、protected、private public类

31、型的变量和方法可以在类的外部被访问,并且可以被子类继承;private和protected类型的变量和方法则只能在类内部被访问,protected类型的变量和方法与private类型的变量和方法的区别在于:前者可以被子类继承,后者则不能。 缺省情况下,类中的变量为private,方法为public ITCL中的每个类都有两个build-in方法:configure和cget,configure方法用来设置对象的属性(shxng),而cget则用来获取对象的属性(shxng)。第42页/共55页第四十二页,共56页。ITCL 类和对象 通用变量和过程 在C+中,有一类成员变量,它不属于任何一个(

32、y )特定对象,但是却被类的所有对象共享,这种变量被称为静态数据成员。在ITCL中,也提供类似的变量,不过被称为通用变量(common variable)。 在C+中,有一类成员函数属于整个类,可以脱离类的实例而存在,被称为静态成员函数。ITCL中提供了类似的功能,不过被称为过程(procedure),可以用proc命令来声明,一个(y )过程属于整个类,它可以在生成类的实例之前使用。第43页/共55页第四十三页,共56页。ITCL实例(shl)三:class MyRand private variable seed clock secondspublic variable min 0publ

33、ic 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 counterdestructor puts The destructor of MyRand is called ,delete object $thisincr counter -1private method srand publ

34、ic method rand proc getcounter 第44页/共55页第四十四页,共56页。ITCL实例三:body MyRand:srand set seed clock secondsbody MyRand:rand srand return expr $min+$seed%($max-$min)body MyRand:getcounter return $counter对于通用变量和过程,可以直接使用限定名或完全(wnqun)限定名引用:% set MyRand:counter 00% MyRand:getcounter0第45页/共55页第四十五页,共56页。ITCL 类和对

35、象 重用:继承 单重继承: public和protected类型的变量和方法可以(ky)被子类继承;private类型的变量和方法则不能被子类继承,父类中方法可以(ky)在子类中进行重载。 多重继承: ITCL也提供多重继承的机制 每个类只能有一个inherit语句,不过可以(ky)声明多个基类。注意基类必须按重要程度的先后排列,因为如果两个基类具有相同名字的方法的话,在inherit中排在前面的类的方法将被优先继承。第46页/共55页第四十六页,共56页。ITCL 继承只需要(xyo)在派生类中用inherit命令声明从哪个类继承就可以了。 实例四: class person public variable id protected variable age constructor idvar agevar set id $idvar set age $agevar public method live public method energy private method food 第47页/共55页第四十七页,共56页。ITCL 实例(shl)四: body person:live energyputs

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论