TCL编程的语法规则

TCL编程的语法规则,第1张

TCL的语法规则:

1、解释器

在Tcl的数据结构中的核心是Tcl_Interp.一个解释器包含了一套命令,一组变量和一些用于描述状态的东西。每一个 Tcl命令是 在特定的Tcl_Interp中运行的,基于Tcl的应用程序可以同时拥有几个Tcl_Interp。Tcl_Interp是一个轻量级的结构,可以快速的新建和删除。

2、数据类型

Tcl只支持一种数据结构:字符串(string)。所有的命令,命令的所有的参数,命令的结果,所有的变量都是字符串。请牢记这一点,所有的东西都是字符串。这是它比较有特点的方面字符串有三种形式:命令(command),表达式(expresion)和表(list)。

3、Basic Command Syntax 基本语法

Tcl有类似于shell和lisp的语法,当然也有许多的不同。一 条Tcl的命令串包含了一条或多条命令用换行符或分号来隔开,而每一条命令包含了一个域(field)的集合,域使用空白分开的,第一个域是一个命令的名字,其它的是作为参数来传给它。

例如:

set a 22 //相当于C中的 a=22 a是一个变量这条命令分为三个域:1:set 2:a 3:22 set使用于设置变量的值的命令,a、20 作为参数来传给它,a使它要 *** 作的变量名,22是要付给的a值。

Tcl的命令名可以是内置的命令也可以是用户建的新命令,如果是用户用户建的新命令应用程序中用函数Tcl_CreateCommand来创建。所有的参数作为字符串来传递,命令自己会按其所需来解释的参数的。命令的名字必须被打全,但 Tcl解释器找不到一同名的命令时会用 unknown命令来代替。

在很多场合下,unknown 会在库目录中搜寻,找到一个的话,会自动生成一个Tcl命令并调用它。unknown经常完成缩略的命令名的执行。但最好不要使用。

4、注释

和shell很象,第一个字母是"#"的Tcl字符串是注释。

其他细节规则

Grouping arguments with double-quotes 用双引号来集群参数,目的在于使用有空白的参数。

例如:

set a "this string contains whitespace"

如果一个参数一双引号来开始,该参数会一直到下一个双引号才结束。其中可以有换行符和分号。

Variable substitution with $ 用美元符进行变量替换说白了就是引用该变量。

例如:

set a hello

set b $a // b = "hello" 实际上传给set命令的参数

//是b,"hello"

set c a // b = "a"

Command substitution with brackets 命令子替换(用方括号)

例如:

set a [set b "hello"]

实现执行 set b "hello" 并用其结果来替换源命令 中的方括号部分,产生一条新命令

set a "hello" //"hello" 为 set b "hello" 的返回值

最终的结果是b="hello" a="hello"

当命令的一个子域以方括号开始以方括号结束,表示要进行一个命令子替换。并执行该子命令,用其结果来替换原命令中的方括号部分。方括号中的部分都被视为Tcl命令。

如下一个复杂一点的例子:

set a xyz[set b "abc"].[set c "def"]

//return xyzabcdef

Backslash substitution 转移符替换

转移符时间不可打印字符或由它数意义的字符插入进来。这一概念与C语言中的一样。

Backspace (0x8).

f Form feed (0xc).

Newline (0xa).

Carriage-return (0xd).

Tab (0x9).

v Vertical tab (0xb).

{ Left brace (`{").

} Right brace (`}").

[ Open bracket (`[").

] Close bracket (`]").

$ Dollar sign (`$").

sp Space (` "): does not terminate argument.

Semicolon: does not terminate command.

" Double-quote.

Grouping arguments with braces 用花扩括号来集群参数

用花扩括号来集群参数与用双引号来集群参数的区别在于:用花扩括号来集群参数其中的三种上述的子替换不被执行。而且可以嵌套。

例如:

set a {xyz a {b c d}}//set收到两个参数 a "xyz a {b c d}"

eval {

set a 22

set b 33

}//eval收到一个参数 "set a 22

set b 33"

5、命令综述

1.一个命令就是一个字符串(string)。

2.命令是用换行符或分号来分隔的。

3.一个命令由许多的域组成。第一个于是命令名,其它的域作为参数来传递。

4.域通常是有空白(Tab横向制表健 Space空格)来分开的。

5.双引号可以使一个参数包括换行符或分号。三种子替换仍然发生。

6.花括号类似于双引号,只是不进行三总体换。

7.系统只进行一层子替换,机制替换的结果不会再去做子替换。而且子替换可以在任何一个域进行。

8.如果第一个非控字符是`#",这一行的所有东西都是注释。

6、表达式

对字符串的一种解释是表达式。几个命令将其参数按表达式处理,如:expr、for 和 if,并调用Tcl表达式处理器(Tcl_ExprLong,Tcl_ExprBoolean等)来处理它们。其中的运算符与C语言的很相似。

!

逻辑非

* / % + -

<>>

左移 右移 只能用于整数。

>= == !=

逻辑比较

&^ |

位运算和 异或 或

&&''

逻辑"和" "或"

x y : z

If-then-else 与C的一样

Tcl 中的逻辑真为1,逻辑假为0。

一些例子:

5./ 4.0

5./ ( [string length "abcd"] + 0.0 )

计算字符串的长度 转化为浮点数来计算

"0x03" >"2"

"0y" <"0x12"

都返回 1

set a 1

expr $a+2

expr 1+2

都返回 3

注释:

puts {Hello, World - In Braces}; # 这种注释方式才是正确的

puts {Bad comment syntax example}  # *Error* - there is no semicolon!这是一个错误,因为tcl的语法规定,命令的参数结束的方式为或者新的一行

变量:

初始化一个变量用set关键字: 

 # set关键字可以接受两个参数:并返回第一参数(也就是变量名)的内容(第二个参数)

#set关键字也可以接受一个参数,如果只接受一个参数的时候返回这个变量的内容

set  x  10  # 定义变量x的值为10

set  y  x+100  # 定义变量y的值为 x+100  这里会把x+100 看成整体的一个字符串,这里可以看出tcl默认都认为是字符串来出来

set  y  $x+100  # 定义变量y的值为 10+100 ,这里$符号告诉解释器x是一个变量而不是字符串

set  y [expr  $x+100]  # 定义变量y的值为110,当tcl解释器遇到[] 的时候会去执行里面的内容并返回结果。

set  y  "$x   ddd" # 这里双引号的作用是允许这个字符串中有空格

set   y    {$x 10}   # 这里的x不会被解释,所以{}的作用是,直接定义 一整串字符串

puts:转义符

set Z Albany

set Z_LABEL "The Capitol of New York is: "

puts "$Z_LABEL $Z"  # Prints the value of Z

puts "$Z_LABEL \$Z"  # Prints a literal $Z instead of the value of Z

puts "\nBen Franklin is on the \$100.00 bill"

set a 100.00

puts "Washington is not on the $a bill"    # This is not what you want

puts "Lincoln is not on the $$a bill"      # This is OK

puts "Hamilton is not on the \$a bill"    # This is not what you want

puts "Ben Franklin is on the \$$a bill"    # But, this is OK

puts "\n................. examples of escape strings"

puts "Tab\tTab\tTab"

puts "This string prints out \non two lines"

puts "This string comes out\

on a single line"

数组:

set a [list 1 2 3 4]    # 初始化一个列表

lappend a 5 # 追加一个变量,注意这里的列表a没有加$ 

lindex $a 1 # 获取列表第二值,这里加上了$

llength $a  # 返回列表的长度

lrange $a 0 2 # 返回前三个数这里取到了第三个值

字符串格式化:

set name john

set age 20

set msg [format "%s is %d years old" $name $age] # 格式化

puts $msg


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7282091.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存