TCL_TK进阶练习
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TCL_TK 进阶练习 2
脚本,对 TCl 程序进行初始化。
2.2.3. Tcl 过程 prn 和 setenv
在初始化文件“~/.myapp.tcl”中可定义若干过程(porc) ,每个过程可在以后被调用,相当 一个新的 Tcl 命令。在“~/.myapp.tcl”定义了两个过程 prn 和 setenv。 过程 prn,是对命令 puts 扩展。它的用法为: prn str str str … prn 将把该命令所跟个数不限参数显示于屏幕上。如 prn Welcom you to use my TCL: $argv0 过程 setenv 是仿 csh 设计的一个过程,用于设置或显示环境变量。Tcl 继承 UNIX 的全部环 境变量,并用一维数组 env 表示,环境变量的名作为数组下标,该下标数组元素的值就是相应环 境变量的值。setenv 的用法是: setenv [key [value]] 它可跟 0~2 个参数。参数个数为 2,为设置一个新的环境变量,第一个参数是环境变量的 名,第二个参数是该环境变量的值;参数个数为 1,用于显示与此参数相匹配的所有环境变量; 参数个数为 0,为显示所有环境变量。
2.2. Tcl 的用户初始化( tcl1)
2.2.1. 用户初始化函数替换系统初始化函数
在 tcl0.c 中函数 Tcl_Init 是 Tcl 的系统初始化函数,Tcl 的所有功能都在这个函数中被规定。 现在用另一个初始化函数 Tcl_AppInit 替换 Tcl_Init,如 /* file: tcl1.c */ int main(int argc, char *argv[]) { Tcl_Main(argc, argv, Tcl_AppInit); exit(0); } 用户初始化函数 Tcl_AppInit 与系统初始化函数 Tcl_Init 类型相同,故具有可替换性。
2. Tcl
2.1. 基本 Tcl( tcl0)
2.1.1. tcl0 的生成
用如下 C 语言程序: /* file tcl0.c */ # include <tcl.h> int main(int argc, char *argv[]) { Tcl_Main(argc, argv, Tcl_Init); exit(0); } 经用如下命令编译: gcc -o tcl0 main.c -I/usr/local/include /usr/local/lib/libtcl.a -lsocket 便可生成一个标准的 Tcl 可执行程序 tcl0。 关键之点: 一是源程序 tcl0.c 中包含了头文件 tcl.h; 二是在编译连接时用了 Tcl 标准库 libtcl.a 和另一个标准库 libsocket.a(后者是前者所要求的) 。本程序中只调用了两个库函数 Tcl_Main 和 Tcl_Init。
Tcl-Tk 进阶练习 TclSteps
申 明 1. 综述
本进阶练习包含 9 个单元: tcl0:由 C 程序建立最基本的 Tcl 可执行程序 tcl0。 tcl1:建立的 tcl1 具有自动执行一个 Tcl 脚本,进行初始化。 tcl2:建立的 tcl2,允许用户用 C 语言创建 Tcl 命令。 tcl3:C 程序中读写 Tcl 中全局变量。 tcl4:Tcl 中的全局变量和 C 程序中的变量连接,实现互通,同步改变。 tk0:由 C 程序建立最基本的 Tcl-Tk 可执行程序 tk0。 tk1:建立的 tk1,作为一个 Tcl-Tk 的练习平台。 tk2:建立的 tk2,用按扭调用用户命令的一个实例。 tk3:建立的 tk3,完全的 Tcl-Tk 人机交互界面的一个实例。 所有文件收于在目录~/TclSteps 下。按上述单元分立 9 个子目录。本目录中有一个 Makefile,用 于总控诸子目录的 Make,在本目录中还有.MakeTcl 和.MakeTk 两个文件,分别为下层 tcl#和 tk#两类 子目录的通用 Makefile。
TCL_TK 进阶练习 4
Tcl_SetVar 将此值赋于 Tcl 中的变量 range。有关程序段为: sprintf(interp->result, "%d", rand); Tcl_SetVar(interp, "range", interp->result, TCL_GLOBAL_ONLY); 在 tcl3 中还用 C 定义了两个简单的 Tcl 命令 setRange 和 putRange,直接设置和显示 Tcl 变量 range。另外,在函数 Tcl_AppInit 中还用函数 Tcl_SetVar 设置了 range 的初值。
2.4. C 中读写 Tcl 中变量, tcl3
2.4.1. 递减随机数命令 random 的设计
形式上递减随机数命令 random 仍保持在 tcl2 中定义的随机数命令一样,如 random [limit] 但此 random 较先前 tcl2 中定义的同名命令区别在于,此 random 同 Tcl 的一个全局变量 range 相关。每次执行此命令产生的随机数将自动赋值给该全局变量 range。当命令的参数个数 为 0 时,则产生的随机数较前次产生的随机数要小,除非 range 的值为 0。当命令参数为 1 时, 同先前的 ramdom 一样,产生一个在该参数范围内的随机数。
程序 tcl2 用了本目录下的 myapp.tcl 作为初始化文件,此文件开始部分如下: source $env(HOME)/.myapp.tcl proc Random {} { global range; if {$range <= 0} { set range 5000 } while { $range > 0} { prn $range: [set range [random $range]] } } 第一行中$env(HOME)代表环境变量 HOME 的值,所以本行是读文件” ~/.myapp.tcl” (其中 定义了 proc prn) 。 第二行开始,定义了又一个过程 Random。此过程无需参数。它核心部分是一个 while 循环, 此循环中仅一句: prn $range: [set range [random $range]] 这一句显示两个随机数,冒号左的$range 是 range 原先值;冒号右的两重方括号代表 range 的新值,内层方括号用 random 命令以 range 原先值为上界产生一随机数,接着由外层方括号用 set 命令把刚产生的随机数重新赋值给 range。此循环执行到变量 range 的值降为 0 为止。 过程 Random 要求全局变量 range 的存在,在第一次调用 Random 之前,必先用 set 命令 建立变量 range,如 set range “ ” 进入 Random 后,若检查出 range 的值小于或等于 0,则重置 range 为 5000。
来自百度文库
2.2.2. 用户初始化之一:用 Tcl_EvalFile 函数读 Tcl 脚本
用户初始化函由用户自建,除必须首先调用系统初始化函数 Tcl_Init,用户具有“无限”的 扩展空间。在 tcl1.c 中,采用了函数 Tcl_EvalFile 读入 Tcl 脚本“~/.myapp.tcl” ,如 char *tcl_RcFileName = " ~/.myapp.tcl"; int Tcl_AppInit(Tcl_Interp *interp) { if (Tcl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } Tcl_EvalFile(interp, tcl_RcFileName); return TCL_OK; } 在 C 中用 Tcl_EvalFile 函数读一个 Tcl 脚本,就相当在交换运行过程中用 source 命令读 Tcl
2.3. 用户自建 Tcl 命令( tcl2)
Tcl 允许用户用 C 语言创建 Tcl 命令。在 tcl2 中支持的命令 random 就是用户自建的命令。
2.3.1. 自建命令的设计
自建命令由命令名和根据功能需求若干个参数组成。如自建命令 random 设计为: random [limit] 这是一个取随机数的命令,它要求 0~1 个参数。如无参数,则产生一个随机数;如有一个 参数,此参数必须是整数,产生一个在此参数范围内( -|limit| ~ |limit| )的随机数。如给的参数不 是整数或参数个数多于 1 个,则报错。 用此命令产生一个 200 以内的随机数,有两种等价的方法: % random 200 或 % expr [random] % 200 此命令 expr 对其所跟的一“表达式”进行计算,输出结果;此表达式中第 1 项方括号表示 其内中的一条 TCL 命令的执行结果(一个未给定范围的随机数) 。
2.3.2. 自建命令的注册
在用户初始化函数 Tcl_AppInit 中要为每一个用 C 语言定义的自建命令注册,如 Tcl_CreateCommand(interp, "random", tclRandom, (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); 函数 Tcl_CreateCommand 中第 2 个参数应是一个字符串,即该命令在 Tcl 中的命令名;第 3 个参数是实现该命令的 C 程序函数名(应理解为该函数的指针) 。对于一个自建命令,Tcl 中的 命令名和 C 中函数名是不同质的, “字面上”可以相同也可不同。
2.3.3. 自建命令的函数的定义
用 C 语言定义的自建命令必须用统一的函数类型,如 int tclRandom(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]); 需要说明的是: 此函数的第 3、4 个参数用作为函数的输入,字符串数组 argv,为 tcl2 运行中调用此命令时 的“命令行参数” ,它包含命令名和命令参数;argc 是命令行参数的个数,此例中它不得超过 2; argv[0] 为命令名,在此例中就是” random” ;argv[1] 、argv[2]…为命令的参数,在此例中最多只许
TCL_TK 进阶练习 3
argv[1]非空。 根据输入,tclRandom 调用 C 库的标准函数产生所要求的随机数,再将它(一个整数)转换 为字符串,写至 interp->result。 此函数是整数型,函数只可返回 TCL_OK(成功)或 TCL_ERROR(失败) 。
2.3.4. 递降随机数的生成, Tcl 过程 Rnadom
2.1.2. tcl0 的用法
tcl0 三种基本运行方式: 1) 全交互 完全使用 Tcl 语言,交互操作,如
TCL_TK 进阶练习 1
tcl0 % set file tcl.c % puts $file % 退出 tcl0,用 exit 命令。 2) 批作业 用 Tcl 语言写一个脚本:init.tcl,将脚本名作为 tcl0 的参数,如 tcl0 script tcl0 即读入脚本 init.tcl,边读入边解释边执行,执行完即退出。 3) 初始化 用 Tcl 语言写一个脚本:init.tcl,进入 tcl0 后用 source 命令读入脚本,如 tcl0 % source init.tcl % tcl0 边读边解释执行脚本内容,执行完脚本内容,继续交互方式运行。
2.4.2. 在 C 中对 Tcl 中全局变量的读写
random 命令仍由名为 tclRandom 的 C 函数来实现,由于设计的功能的要求,需要按读写 Tcl 中的全局变量 range。在此函数中从 Tcl 中取变量 range 的值(字符串)由函数 TclGetVar 实 现,再用函数 Tcl_GetInt 将其转换为整数(int range) 。有关程序段为: int range; Tcl_GetInt(interp, Tcl_GetVar(interp, "range", TCL_GLOBAL_ONLY), &range); 当新的随机数 rand 产生之后,一方面将其值写至 interp->result(显示于屏幕) ,接着用函数
脚本,对 TCl 程序进行初始化。
2.2.3. Tcl 过程 prn 和 setenv
在初始化文件“~/.myapp.tcl”中可定义若干过程(porc) ,每个过程可在以后被调用,相当 一个新的 Tcl 命令。在“~/.myapp.tcl”定义了两个过程 prn 和 setenv。 过程 prn,是对命令 puts 扩展。它的用法为: prn str str str … prn 将把该命令所跟个数不限参数显示于屏幕上。如 prn Welcom you to use my TCL: $argv0 过程 setenv 是仿 csh 设计的一个过程,用于设置或显示环境变量。Tcl 继承 UNIX 的全部环 境变量,并用一维数组 env 表示,环境变量的名作为数组下标,该下标数组元素的值就是相应环 境变量的值。setenv 的用法是: setenv [key [value]] 它可跟 0~2 个参数。参数个数为 2,为设置一个新的环境变量,第一个参数是环境变量的 名,第二个参数是该环境变量的值;参数个数为 1,用于显示与此参数相匹配的所有环境变量; 参数个数为 0,为显示所有环境变量。
2.2. Tcl 的用户初始化( tcl1)
2.2.1. 用户初始化函数替换系统初始化函数
在 tcl0.c 中函数 Tcl_Init 是 Tcl 的系统初始化函数,Tcl 的所有功能都在这个函数中被规定。 现在用另一个初始化函数 Tcl_AppInit 替换 Tcl_Init,如 /* file: tcl1.c */ int main(int argc, char *argv[]) { Tcl_Main(argc, argv, Tcl_AppInit); exit(0); } 用户初始化函数 Tcl_AppInit 与系统初始化函数 Tcl_Init 类型相同,故具有可替换性。
2. Tcl
2.1. 基本 Tcl( tcl0)
2.1.1. tcl0 的生成
用如下 C 语言程序: /* file tcl0.c */ # include <tcl.h> int main(int argc, char *argv[]) { Tcl_Main(argc, argv, Tcl_Init); exit(0); } 经用如下命令编译: gcc -o tcl0 main.c -I/usr/local/include /usr/local/lib/libtcl.a -lsocket 便可生成一个标准的 Tcl 可执行程序 tcl0。 关键之点: 一是源程序 tcl0.c 中包含了头文件 tcl.h; 二是在编译连接时用了 Tcl 标准库 libtcl.a 和另一个标准库 libsocket.a(后者是前者所要求的) 。本程序中只调用了两个库函数 Tcl_Main 和 Tcl_Init。
Tcl-Tk 进阶练习 TclSteps
申 明 1. 综述
本进阶练习包含 9 个单元: tcl0:由 C 程序建立最基本的 Tcl 可执行程序 tcl0。 tcl1:建立的 tcl1 具有自动执行一个 Tcl 脚本,进行初始化。 tcl2:建立的 tcl2,允许用户用 C 语言创建 Tcl 命令。 tcl3:C 程序中读写 Tcl 中全局变量。 tcl4:Tcl 中的全局变量和 C 程序中的变量连接,实现互通,同步改变。 tk0:由 C 程序建立最基本的 Tcl-Tk 可执行程序 tk0。 tk1:建立的 tk1,作为一个 Tcl-Tk 的练习平台。 tk2:建立的 tk2,用按扭调用用户命令的一个实例。 tk3:建立的 tk3,完全的 Tcl-Tk 人机交互界面的一个实例。 所有文件收于在目录~/TclSteps 下。按上述单元分立 9 个子目录。本目录中有一个 Makefile,用 于总控诸子目录的 Make,在本目录中还有.MakeTcl 和.MakeTk 两个文件,分别为下层 tcl#和 tk#两类 子目录的通用 Makefile。
TCL_TK 进阶练习 4
Tcl_SetVar 将此值赋于 Tcl 中的变量 range。有关程序段为: sprintf(interp->result, "%d", rand); Tcl_SetVar(interp, "range", interp->result, TCL_GLOBAL_ONLY); 在 tcl3 中还用 C 定义了两个简单的 Tcl 命令 setRange 和 putRange,直接设置和显示 Tcl 变量 range。另外,在函数 Tcl_AppInit 中还用函数 Tcl_SetVar 设置了 range 的初值。
2.4. C 中读写 Tcl 中变量, tcl3
2.4.1. 递减随机数命令 random 的设计
形式上递减随机数命令 random 仍保持在 tcl2 中定义的随机数命令一样,如 random [limit] 但此 random 较先前 tcl2 中定义的同名命令区别在于,此 random 同 Tcl 的一个全局变量 range 相关。每次执行此命令产生的随机数将自动赋值给该全局变量 range。当命令的参数个数 为 0 时,则产生的随机数较前次产生的随机数要小,除非 range 的值为 0。当命令参数为 1 时, 同先前的 ramdom 一样,产生一个在该参数范围内的随机数。
程序 tcl2 用了本目录下的 myapp.tcl 作为初始化文件,此文件开始部分如下: source $env(HOME)/.myapp.tcl proc Random {} { global range; if {$range <= 0} { set range 5000 } while { $range > 0} { prn $range: [set range [random $range]] } } 第一行中$env(HOME)代表环境变量 HOME 的值,所以本行是读文件” ~/.myapp.tcl” (其中 定义了 proc prn) 。 第二行开始,定义了又一个过程 Random。此过程无需参数。它核心部分是一个 while 循环, 此循环中仅一句: prn $range: [set range [random $range]] 这一句显示两个随机数,冒号左的$range 是 range 原先值;冒号右的两重方括号代表 range 的新值,内层方括号用 random 命令以 range 原先值为上界产生一随机数,接着由外层方括号用 set 命令把刚产生的随机数重新赋值给 range。此循环执行到变量 range 的值降为 0 为止。 过程 Random 要求全局变量 range 的存在,在第一次调用 Random 之前,必先用 set 命令 建立变量 range,如 set range “ ” 进入 Random 后,若检查出 range 的值小于或等于 0,则重置 range 为 5000。
来自百度文库
2.2.2. 用户初始化之一:用 Tcl_EvalFile 函数读 Tcl 脚本
用户初始化函由用户自建,除必须首先调用系统初始化函数 Tcl_Init,用户具有“无限”的 扩展空间。在 tcl1.c 中,采用了函数 Tcl_EvalFile 读入 Tcl 脚本“~/.myapp.tcl” ,如 char *tcl_RcFileName = " ~/.myapp.tcl"; int Tcl_AppInit(Tcl_Interp *interp) { if (Tcl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } Tcl_EvalFile(interp, tcl_RcFileName); return TCL_OK; } 在 C 中用 Tcl_EvalFile 函数读一个 Tcl 脚本,就相当在交换运行过程中用 source 命令读 Tcl
2.3. 用户自建 Tcl 命令( tcl2)
Tcl 允许用户用 C 语言创建 Tcl 命令。在 tcl2 中支持的命令 random 就是用户自建的命令。
2.3.1. 自建命令的设计
自建命令由命令名和根据功能需求若干个参数组成。如自建命令 random 设计为: random [limit] 这是一个取随机数的命令,它要求 0~1 个参数。如无参数,则产生一个随机数;如有一个 参数,此参数必须是整数,产生一个在此参数范围内( -|limit| ~ |limit| )的随机数。如给的参数不 是整数或参数个数多于 1 个,则报错。 用此命令产生一个 200 以内的随机数,有两种等价的方法: % random 200 或 % expr [random] % 200 此命令 expr 对其所跟的一“表达式”进行计算,输出结果;此表达式中第 1 项方括号表示 其内中的一条 TCL 命令的执行结果(一个未给定范围的随机数) 。
2.3.2. 自建命令的注册
在用户初始化函数 Tcl_AppInit 中要为每一个用 C 语言定义的自建命令注册,如 Tcl_CreateCommand(interp, "random", tclRandom, (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); 函数 Tcl_CreateCommand 中第 2 个参数应是一个字符串,即该命令在 Tcl 中的命令名;第 3 个参数是实现该命令的 C 程序函数名(应理解为该函数的指针) 。对于一个自建命令,Tcl 中的 命令名和 C 中函数名是不同质的, “字面上”可以相同也可不同。
2.3.3. 自建命令的函数的定义
用 C 语言定义的自建命令必须用统一的函数类型,如 int tclRandom(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]); 需要说明的是: 此函数的第 3、4 个参数用作为函数的输入,字符串数组 argv,为 tcl2 运行中调用此命令时 的“命令行参数” ,它包含命令名和命令参数;argc 是命令行参数的个数,此例中它不得超过 2; argv[0] 为命令名,在此例中就是” random” ;argv[1] 、argv[2]…为命令的参数,在此例中最多只许
TCL_TK 进阶练习 3
argv[1]非空。 根据输入,tclRandom 调用 C 库的标准函数产生所要求的随机数,再将它(一个整数)转换 为字符串,写至 interp->result。 此函数是整数型,函数只可返回 TCL_OK(成功)或 TCL_ERROR(失败) 。
2.3.4. 递降随机数的生成, Tcl 过程 Rnadom
2.1.2. tcl0 的用法
tcl0 三种基本运行方式: 1) 全交互 完全使用 Tcl 语言,交互操作,如
TCL_TK 进阶练习 1
tcl0 % set file tcl.c % puts $file % 退出 tcl0,用 exit 命令。 2) 批作业 用 Tcl 语言写一个脚本:init.tcl,将脚本名作为 tcl0 的参数,如 tcl0 script tcl0 即读入脚本 init.tcl,边读入边解释边执行,执行完即退出。 3) 初始化 用 Tcl 语言写一个脚本:init.tcl,进入 tcl0 后用 source 命令读入脚本,如 tcl0 % source init.tcl % tcl0 边读边解释执行脚本内容,执行完脚本内容,继续交互方式运行。
2.4.2. 在 C 中对 Tcl 中全局变量的读写
random 命令仍由名为 tclRandom 的 C 函数来实现,由于设计的功能的要求,需要按读写 Tcl 中的全局变量 range。在此函数中从 Tcl 中取变量 range 的值(字符串)由函数 TclGetVar 实 现,再用函数 Tcl_GetInt 将其转换为整数(int range) 。有关程序段为: int range; Tcl_GetInt(interp, Tcl_GetVar(interp, "range", TCL_GLOBAL_ONLY), &range); 当新的随机数 rand 产生之后,一方面将其值写至 interp->result(显示于屏幕) ,接着用函数