Tcl学习笔记(一)——环境搭建及基本语法

一、Tcl简介

TCL(Tool Command Language,即工具命令语言)是一种解释执行的脚本语言。所谓解释执行语言,是指其不需要通过编译和联结,而是直接对每条语句进行顺序解释、执行。

TCL包含语言和工具库,TCL语言主要使用于发布命令给一些交互程序如文本编辑器、调试器和shell;TCL包含用于扩展TCL命令的C\C++过程和函数,每个应用程序都可以根据自己的需要对TCL语言进行扩展。TCL在FPGA中使用广泛,比如在静态时序约束中的命令语句、在NIOS生成的自定义组件的等。

二、环境搭建

打开Tcl官方下载网址:Download & Install Tcl | ActiveState,点击Get Started with Tcl并注册账号。

然后创建一个organization并下载安装包。

安装,在Choose Setup Type中选择Typical即可,其他的默认,一直到finish就安装完成了。

三、Tcl语法

3.1 脚本构成

Tcl具有两大特征:(1)所有结构都是一条命令,包括语法结构;(2)所有数据类型都可被视为字符串(基于字符串的命令语言)。

一条Tcl脚本是由一个或多个单词构成的,单词之间以空格或Tab键隔开,第一个单词为命令名,其余单词为该命令的参数。

而Tcl脚本可以只包含一条命令,也可以包含多条命令。命令之间可以由分号隔开,也可以直接采用换行方式,采用分号作为分隔符时分号左侧命令不显示。

例如通过set进行变量赋值,set后第一个参数是变量名、第二个参数是变量值。

3.2 处理过程

Tcl对命令的处理过程分为两步:解析和执行。

  • 在解析阶段,Tcl解释器运用规则把命令分解为一个个独立的单词,同时进行必要的置换;
  • 在执行阶段,Tcl解释器会把第一个单词作为命令名,并查看该命令是否有定义,同时查找完成该命令功能的命令过程。如果有定义,则Tcl解释器调用该命令过程,并把命令中的全部单词传递给该过程。命令过程会根据自己的需求来分辨这些单词的具体含义。每个命令对所需参数都有一些自身的要求,如果不满足要求,则会报错。Tcl会把错误信息保存在全局变量errorInfo中,可以通过puts$errorInfo的方式输出变量值,进而查看错误信息。

3.3 三种替换

**Tcl有三种替换形式:变量替换、命令替换以及反斜线替换。**每种替换都会把单词中的一些原始字符替换为另外一些值。Tcl 解释器在执行命令过程之前进行这些替换。替换可以发生在命令中的任何一个单词上,包括命令名本身,在一个单词中也可以进行任意多个替换。

3.3.1 变量替换

变量替换就是把某个变量的值赋给另一个变量,通过$符号完成,将Tcl变量的值插入单词中

变量替换可以在一个单词中的任何位置进行,可以进行任意多次,例如:

变量名由$符号后面所有的数字、字母以及下划线组成。因此第一个变量名result 到号为止,第二个变量名就是base。

因为下划线不是字符串分隔符,因此tcl解释器不认为存在x_的变量。可以用{}把变量括起来,使tcl解释器把它当作一个整体。

3.3.2 命令替换

命令替换可以把一个单词的部分或全部替换为一个命令的结果。命令替换通过方括号[]表示,会调用括号中的命令。

方括号[]内的字符必须是有效的TcI脚本,脚本可以包含任意多条命令,命令之间用换行符隔开,也可以用分号隔开,但最终的返回值为最后一条命令的返回值。

3.3.3 反斜线替换

反斜线替换用于向单词中插入特殊字符,如换行符、[、$、空格等会被Tcl解析器认为是有特殊含义的字符。

这里有两处反斜线后面跟着空格,在单词中会被替换为一个空格,而这个空格符不会被视为单词分隔符。还有两处反斜线后面跟着S符号,在单词中这会被替换为一个S符号,而这个S符号会被作为普通字符处理(它们不会触发变量替换)。在反斜线后跟着n,会被替换为换行符。

Tcl支持的反斜线序列如下表。

|----------------------|--------------------------------------------|
| 反斜线序列 | 替换结果 |
| \a | 警告音(0x7) |
| \b | 删除(0x8) |
| \f | 换页符(0xc) |
| \n | 换行符(0xa) |
| \r | 回车(0xd) |
| \t | 制表符(0x9) |
| \v | 垂直制表符(0xb) |
| \ooo | 八进制值位ooo(1个、2个或3个)的8位Unicode字符 |
| \xhh | 十六进位值位hh的8位Unicode字符(可以有任意个h,但除了最后两个都会被忽略) |
| \uhhhh | 十六进制位hhhh的16位Unicode字符(1~4个h) |
| \newline whitespace | 一个空格字符 |

反斜线-换行符序列和一般的替换不同,这种替换在Tcl解释器解析命令前就要单独进行。这意味着,用于替换反斜线-换行符的空格符会被作为单词分隔符看待,除非它们被双引号或大括号括起来。

Tcl置换有两条规则:

1.Tcl在解析一条命令时,只从左向右解析一次,进行一轮置换,每一个字符只会被扫描一次;

2.每个字符只会发生一次置换,而不会对置换后的结果进行再次扫描置换。

3.4 两种引用

Tcl 提供了一些方法,可以**阻止解析器对和分号等字符进行特殊处理,这些方法称为引用。** 例如,/向单词中插入一个普通的$字符,而不会引发变量替换。除了反斜线替换外,Tcl还提供了另外两种引用形式:双引号引用和大括号引用。双引号取消其中的单词和命令分隔符的特殊解释,大括号取消其中所有特殊字符的特殊解释。

3.4.1 双括号引用

变量替换、命令替换以及反斜线替换在双引号中正常进行。如果想要在由双引号括起来的单词中包含双引号字符,则应该使用反斜线替换。

3.4.2 大括号引用

大括号会取消其中所有特殊字符的特殊意义。如果一个单词以左大括号开头,那么直到与它配对的右大括号为止,所有字符都将被原封不动地识别为这个单词的值。这个单词中不会发生任何替换,所有的空格、制表符、换行符以及分号都作为普通字符处理。

如果同时使用双引号和大括号,则最外层的起主导作用。

3.5 注释

Tcl的注释符为#。第一行的注释与set命令的分号后,表明命令结束;第三行的注释被当作set命令的一部分,因此不合法;如果注释语句中出现了反斜线,那么另起一行也被认为是注释的一部分。

注释大段代码有二种方法:

1.if命令,由于if的判断条件始终为0,因此大括号的代码块不会被执行

2.大括号,大括号具有组织内部置换的功能

参考文献:

《Tcl/Tk入门经典》

《Vivado/Tcl零基础入门与案例实战》

相关推荐
冰帝海岸13 分钟前
01-spring security认证笔记
java·笔记·spring
小二·1 小时前
java基础面试题笔记(基础篇)
java·笔记·python
wusong9994 小时前
mongoDB回顾笔记(一)
数据库·笔记·mongodb
猫爪笔记4 小时前
前端:HTML (学习笔记)【1】
前端·笔记·学习·html
Resurgence034 小时前
【计组笔记】习题
笔记
pq113_65 小时前
ftdi_sio应用学习笔记 3 - GPIO
笔记·学习·ftdi_sio
爱米的前端小笔记6 小时前
前端八股自学笔记分享—页面布局(二)
前端·笔记·学习·面试·求职招聘
fei_sun7 小时前
【Verilog】第一章作业
fpga开发·verilog
寒笙LED8 小时前
C++详细笔记(六)string库
开发语言·c++·笔记
深圳市雷龙发展有限公司longsto8 小时前
基于FPGA(现场可编程门阵列)的SD NAND图片显示系统是一个复杂的项目,它涉及硬件设计、FPGA编程、SD卡接口、NAND闪存控制以及图像显示等多个方面
fpga开发