tcl库、包、模块的创建与使用

来源:互联网 发布:centoa安装java 7u80 编辑:程序博客网 时间:2024/05/18 01:45

1.库的创建与使用

step1:进行库的创建,即创建指定目录中的脚本文件集。通常来说这些文件的名称以 .tc l结尾。

step2:建立索引,供自动加载机制使用,形式如下

auto_mkindex   .   *.tcl

auto_mkindex 不是一条内建命令,而是Tcl脚本库中的过程。它的第一个参数是目录名,第二个参数是通配符模式,根据与它匹配的情况选中目录中的脚本文件。http://write.blog.csdn.net/postedit

auto_mkindex扫描所有名称与指定模式匹配的文件,建立索引,记录哪个过程由哪个文件定义。它将这个索引存放在该目录中名为 tclIndex 的文件中。如果修改了脚本文件,添加或删除了过程,就应该重新生成这个索引。

step3:在要使用库的应用程序中设置变量auto_path的值。

auto_path是一个包含了目录名的列表。调用自动加载器时,它会依次搜索列表中的各个目录,在它们的tclIndex文件中查找需要的过程。如果同名的过程在多个文件中定义,则会加载按auto_path的目录顺序最先找到的那个过程。通常来说,auto_path会在程序启动时加以设置。例如,如果一个应用程序使用路径/user/local/lib/shapes中的ku,在它的启动脚本中很可能包含如下内容:

set  auto_path   [linsert  $auto_path  0  /usr/local/lib/shapes]

这条命令把/usr/local/lib/shapes加到目录列表的开头,保持了那些已经存在的目录记录,那些Tcl和Tk脚本库仍然可用,但会优先使用usr/local/lib/shapes定义的过程。一旦一个目录正确地生成了索引,并添加到auto_path中,通过自动加载,它当中的所有过程就成为了可用的了

可以在D:\ActiveTcl\lib\tcl8.6\init.tcl文件中填入set  auto_path   [linsert  $auto_path  0  /usr/local/lib/shapes] 即可

2.包的创建与使用

Tcl包是包含一个或多个Tcl脚本和/或二进制共享库的目录。包当中的Tcl脚本应该用 package provide 命令为它提供的包进行声明,如:package provide platform 1.0.3

这条命令说明本文件中的源码提供了(如果目录中有多于一个Tcl脚本,则是共同提供)名为platform的包。

创建一个包时,先把所有的相关代码都放到一个目录下,然后需要创建 pkgIndex.tcl 文件,Tcl解析器用它来加载包。你也可以手动创建这个文件,而且如果情况十分复杂,可能还必须手动创建。但大多数包可以通过使用 pkg_mkIndex 过程创建Tcl系统管理包的加载所需的索引文件。

创建索引的命令的基本格式如下:

pkg_mkIndex   .  *.tcl                     

这条命令查找当前目录中所有名称以 .tcl结尾的文件,在目录中创建文件pkgIndex.tcl,该文件中包含了包的索引信息。

第一次处理package require 命令时,Tcl解释器执行了 package unknown 脚本。这个脚本对全局变量 auto_path中列出的所有目录及其直接子目录中的所有pkgIndex.tcl文件调用source。

3.模块的创建与使用

Tcl8.5 增加了对Tcl模块的支持,它没有传统的包那样强的适应性,但大大减少了Tcl解释器查找可用包和模块时对文件系统的访问。对Tcl8.5及更新版本,推荐采用模块方法创建和发表扩展包。

最主要的简化是:每一个模块必须定义在一个文件中,这个文件由Tcl source 命令读取。在文件中,这个模块可以定义一个或多个Tcl包。

要使用Tcl模块定义的包,就在Tcl程序中使用package require 命令,和使用非模块中的包的情况一样。

如: package  require platform::shell 1.1.3

Tcl解释器首先在Tcl模块文件中查找包。Tcl根据“模块路径”中的目录列表进行搜索,该路径与auto_path列表中的目录没有关联。仅在不能找到合适的Tcl模块之后,Tcl才会使用传统方法扫描auto_path列表中的目录,查找符合要求的包。

安装Tcl模块

在创建模块时,存放它们的文件名必须与以下正则表达式匹配。

([[:alpha:]][:[alnum:]]*)-([[:digit:]].*)\.tm

存放Tcl模块的目录树与auto_path相互独立。Tcl查找模块时会查找::tcl::tm::path list 命令列出的目录。这个目录称为模块路径。

这里不会使用auto_path和tcl_pkgPath变量。当一个应用程序请求一个包时,在开始搜索之前,所有请求的包的名称会翻译为部分路径,包的名称中出现的所有::都会由该平台所用的目录分隔符替换。例如:

package require encoding::base64 

结果是部分路径encoding/base64。在翻译之后,Tcl把所得的部分路径串接到模块路径列表中的每个目录后面,然后依次对各个路径进行模式匹配检查,查找所需的模块文件。

命令::tcl::tm::path list 返回当前的模块路径列表。可以使用::tcl::tm::path add 和::tcl::tm::path remove 命令为这个列表添加或删除目录。