Tcl语言参考(三)

三、Tcl表达式

(1)操作数

Tcl表达式的操作数通常是整数或实数。整数一般是十进制的, 但如果整数前两个字符是0x则这个整数被看作是十六进制的。Tcl的实数的写法与ANSI C中完全一样。

(2)运算符

Tcl中的运算符的语法形式和用法跟ANSI C中完全一致。另外,Tcl中提供了大量的常用数学函数来增强自身的数学运算和处理能力,这些函数的形式和用法大都与ANSI C中的数学函数完全一致。

四、Tcl流程控制

TCL中的控制流和C语言类似,包括if、switch、for、while、foreach、break、continue等命令。

(1)条件语句

if { $x>0 } {.....} elseif { $x==1 } {.....} elseif { $x==2 } {....} else {.....}

注意,上例中'{'一定要写在上一行,因为如果不这样,TCL 解释器会认为if命令在换行符处已结束,下一行会被当成新的命令,从而导致错误的结果。在Tcl的其他流程控制命令的书写中也要注意这个问题。书写中还要注意的一个问题是if 和{之间应该有一个空格,否则TCL解释器会把'if{'作为一个整体当作一个命令名,从而导致错误。

switch [option] $x {a -b {incr t1}c {incr t2}default {incr t3}}

其中可选参数option,表示进行匹配的方式。TCL支持三种匹配方式:-exact方式,-glob方式,-regexp方式,缺省情况表示-glob方式。-exact方式表示的是精确匹配,-glob方式的匹配方式和string match 命令的匹配方式相同,-regexp方式是正规表达式匹配方式。条件中a的后面跟一个'-'表示使用和下一个模式相同的脚本,default表示匹配任意值。一旦switch命令 找到一个模式匹配,就执行相应的脚本,并返回脚本的值作为switch命令的返回值。

(2)循环语句

for init test reinit body

参数init是一个初始化脚本,第二个参数test是一个表达式,用来决定循环什么时候中断,第三个参数reinit是一个重新初始化

的脚本,第四个参数body也是脚本。如:

 

set b " "for {set i [expr [llength $a] -1]} {$i>=0} {incr i -1} {lappend b [lindex $a $i]}

while的例子——假设变量 a 是一个链表,下面的脚本把a 的值复制到b:

set b " "set i [expr [llength $a] -1]while { $i>=0} {lappend b [lindex $a $i]incr i -1}

foreach命令的两种形式:

1、foreach varName list body

第一个参数varName是一个变量,第二个参数list 是一个表(有序集合),第三个参数body是循环体。

每次取得链表的一个元素,都会执行循环体一次。如:

set b " "foreach i $a{set b [linsert $b 0 $i]}

2、foreach varlist1 list1 varlist2 list2 ... body

本语句是上一个的增强形式:可以有多个变量、列表对参与条件判断

五、Tcl过程

TCL支持过程的定义和调用,在TCL中,过程可以看作是用TCL脚本实现的命令,效果与TCL的固有命令相似。我们可以在任何时候使用proc命令定义自己的过程,TCL中的过程类似于C中的函数。TCL中过程是由proc命令产生的。例如:

proc add {x y } {expr $x+$y}

proc命令的第一个参数是你要定义的过程的名字,第二个参数是过程的参数列表,参数之间用空格隔开,第三个参数是一个

TCL脚本,代表过程体。 proc生成一个新的命令,可以象固有命令一样调用:

add 1 2 3

在定义过程时,你可以利用return命令在任何地方返回你想要的值。return命令迅速中断过程,并把它的参数作为过程的结果。

(1)局部变量和全局变量

对于在过程中定义的变量,因为它们只能在过程中被访问,并且当过程退出时会被自动删除,所以称为局部变量;在所有过程之外定义的变量我们称之为全局变量。TCL中局部变量和全局变量可以同名,两者的作用域的交集为空:局部变量的作用域是它所在的过程的内部;全局变量的作用域则不包括任何过程的内部。这一点和C语言有很大的不同。如果我们想在过程内部引用一个全局变量的值,可以使用global命令。

(2)缺省参数和可变参数

可以定义具有缺省参数值的过程,我们可以为过程的部分或全部参数提供缺省值,如果调用过程时未提供那些参数的值,那么过程会自动使用缺省值赋给相应的参数。和C\C++中具有缺省参数值的函数一样,有缺省值的参数只能位于参数列表的后部,即在第一个具有缺省值的参数后面的所有参数,都只能是具有缺省值的参数。

TCL的过程定义还支持可变个数的参数,如果过程的最后一个参数是args, 那么就表示这个过程支持可变个数的参数,位于args以前的参数象普通参数一样处理,但任何附加的参数都需要在过程体中作特殊处理,过程的局部变量args将会被设置为一个列表,其元素就是所有附加的变量。如果没有附加的变量,args就设置成一个空串。

(3)引用:upvar

命令语法:upvar [level] otherVar myVar otherVar myVar ...

upvar命令使得用户可以在过程中对全局变量或其他过程中的局部变量进行访问。

upvar命令的第一个参数otherVar是我们希望以引用方式访问的参数的名字,第二个参数myVar 是这个过程中的局部变量的名字,一旦使用了upvar 命令把otherVar 和myVar 绑定,那么在过程中对局部变量myVar 的读写就相当于对这个过程的调用者中otherVar 所代表的局部变量的读写。下面是一个例子:

proc temp { arg } { upvar $arg b set b [expr $b+2] }proc myexp { var } { set a 4 temp a return [expr $var+$a] }

则: myexp 7 13

这个例子中,upvar 把$arg(实际上是过程myexp中的变量a)和过程temp中的变量b绑定,对b的读写就相当于对a的读写。

upvar命令语法中的level参数表示:调用upvar命令的过程相对于我们希望引用的变量myVar在调用栈中相对位置。例如:

upvar 2 other x

这个命令使得当前过程的调用者的调用者中的变量other,可以在当前过程中利用x访问。缺省情况下,level的值为1,即当前过程(上例中的temp)的调用者(上例中的myexp)中的变量(上例中myexp的a)可以在当前过程中利用局部变量(上例中temp的b)访问。如果要访问全局变量可以这样写:

upvar #0 other x

那么,不管当前过程处于调用栈中的什么位置,都可以在当前过程中利用x访问全局变量other。

[TCL]Tcl语言基礎教程(三)相关推荐

  1. [TCL]Tcl语言基礎教程(二)

                                               Tcl语言参考(二) 二.Tcl变量数据类型 Tcl只支持一种数据类型:字符串(string).所有的命令,命令的 ...

  2. TCL脚本语言光速入门教程,一篇就够了(超全查表)

    目录 引子:初见TCL 基本命令 置换命令 普通置换 变量置换 命令置换 反斜杠置换 其他置换 脚步命令 eval命令 source命令 语言命令 简单变量 数组变量 重构变量及其操作 补充概念 全局 ...

  3. java程序设计p75_java语言程序设计实用教程第四讲控制结构.ppt

    java语言程序设计实用教程第四讲控制结构.ppt 还剩 29页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: ...

  4. EDA实验课课程笔记(三)——TCL脚本语言的学习1

    本文参考资料为<Tcl语言教程>,感谢作者的分享,这里仅仅作为简单常用语法的入门,若有需要后期对本文进行添加补充. EDA实验课课程笔记(三)--TCL脚本语言的学习 前言(TCL综述) ...

  5. TCL脚本语言基础介绍

    Tcl简介(一):Tcl 语法 Tcl 语法 Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以释运行,其强大的功能和简单精妙的语法会使你感到由衷的喜悦,这片文章对 Tcl有很好的描述和说明.如 ...

  6. EDA实验课课程笔记(四)——TCL脚本语言的学习2

    EDA实验课课程笔记(四)--TCL脚本语言的学习2 控制流 if 循环命令 while for foreach break和continue命令 switch source 过程(procedure ...

  7. stm32h7内存分配_【STM32H7教程】第25章 STM32H7的TCM,SRAM等五塊內存基礎知識

    第25章       STM32H7的TCM,SRAM等五塊內存基礎知識 本章教程為大家介紹STM32H7帶的ITCM,DTCM,AXI SRAM,SRAM1,SRAM2,SRAM3,SRAM4和備份 ...

  8. tcl计算机语言,Vivado之TCL脚本语言基本语法介绍

    TCL脚本语言 Tcl(Tool Command Language)是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,而且VIVADO也提供了TCL命令行.最近发现TCL脚本貌似比GUI下操 ...

  9. Vivado中的TCL脚本语言

    本文介绍了Tcl在Vivado中的基础应用,希望起到抛砖引玉的作用,指引使用者在短时间内快速掌握相关技巧,更好地发挥Vivado在FPGA设计中的优势. Vivado TCL脚本语言 使用Tcl作为它 ...

最新文章

  1. Consul + fabio 实现自动服务发现、负载均衡
  2. Winform中使用printDocument控件打印pictureBox中的二维码照片
  3. Python pip使用国内镜像
  4. 牛客题霸 [删除链表的倒数第n个节点] C++题解/答案
  5. armqt字体ttf_QT字体的设置
  6. 《学习OpenCV》课后习题解答(第四章)(仅供参考)(不断更新)
  7. Memcached源码分析 - 内存存储机制Slabs(5)
  8. andorid自定义ViewPager之——子ViewPager滑到边缘后直接滑动父ViewPager
  9. mysql 三种循环的区别_mysql存储过程中的三种循环
  10. oracle12c分片应用场景,Oracle 12cR2数据库(Oracle12.2)新特性之四:Sharding 的增强...
  11. 管理活动目录域服务实训_工商管理学院党总支举行校园公益服务活动
  12. AD7606调试笔记
  13. Shiro之基本使用
  14. CrackMe160 学习笔记 之 024
  15. js插件 excel在线编辑插件X-Spreadsheet
  16. html 前端优化上传视频,前端上传组件Plupload使用---上传大视频(分片上传)
  17. Python爬虫项目整理
  18. 基于深度学习的x射线图像骨龄自动特征提取
  19. ITEXT 目录生成的第二种方法
  20. 软件本地化团队 - 〖0day 资源〗 - 2006.06.03 0day

热门文章

  1. .Net CoreRabbitMQ消息存储可靠机制(下)
  2. 英文短语缩写问题 1199 getline()使用
  3. React-从0到1搭建一个React项目(一)
  4. UE4 保持UV高级材质,基于WorldAlignedTexture材质函数修改而来(参考:知乎)
  5. 友盟第三方登录 无法切换账号 退出 取消授权
  6. linux r base core,安装最新版本的R-base
  7. 逻辑思维训练500题(带答案)前237题 文末附完整版PDF
  8. 史上最全的各类奖学金、各种称号、各种职位中英文对照
  9. C#小游戏之疯狂字母
  10. HUOJ-10857 最大的面积 凸包+DP