Tcl 词法结构
最后修改于 2023 年 10 月 18 日
计算机语言,就像人类语言一样,也有词法结构。 Tcl 语言的词法由基本元素和适用于它们的规则组成。 单词是 Tcl 中的基本元素。 单词可以是命令,也可以是命令的参数。 替换是 Tcl 语法的一条基本规则。
命令
Tcl 是一种基于字符串的解释型命令语言。 一个 Tcl 脚本由命令组成,这些命令由换行符或分号分隔。 命令是基本的执行元素。 一个命令后面跟着一个或多个单词,这些单词是它的参数。 每个参数都用空格分隔。
一个 Tcl 命令具有以下形式:command arg1 arg2 arg3 ...
Tcl 解释器获取句子的每个单词并对其进行评估。 第一个单词被认为是命令。 大多数 Tcl 命令都是可变的。 这意味着它们可以处理可变数量的参数。
当解析 Tcl 脚本时,会评估命令。 每个命令都在其自己的上下文中解释单词。
puts "Tcl language"
在上面的代码片段中,我们有 puts
命令。 此命令将消息打印到控制台。 "Tcl 语言"
是一个被打印的字符串。 与其他语言不同的是,字符串不必用双引号括起来; 除非有空格。
#!/usr/bin/tclsh puts zetcode.com; puts androida.co puts zetcode puts androida
在第一种情况下,命令由分号 ;
字符分隔。 在第二种情况下,它们由换行符分隔。
替换
Tcl 中有三种替换。
- 命令替换
- 变量替换
- 反斜杠替换
方括号用于命令替换。
% puts [expr 1+2] 3
expr
命令用于执行算术运算。 首先,评估方括号之间的命令,并将结果返回给 puts
命令。 然后 puts
命令评估结果并将其打印到控制台。
如果一个单词包含一个美元符号 $
,则 Tcl 执行变量替换。 美元符号和后面的字符在单词中被变量的值替换。
#!/usr/bin/tclsh set name Jane puts name puts $name
我们创建一个名为 name
的变量并为其赋值。
puts name
在这种情况下,我们将字符串 "name" 打印到控制台。
puts $name
在第二种情况下,参数前面有一个 $
字符。 name
变量的值被打印到控制台。
$ ./name.tcl name Jane
使用反斜杠替换,我们转义了字符的原始含义。 例如,\n
代表换行符,\t
是制表符。
% puts "This is \t Sparta" This is Sparta
这里,\t
序列被替换为制表符。
#!/usr/bin/tclsh puts "This was a \"great\" experience" puts "The \\ character is the backslash character" puts "20000\b\b miles"
如果我们想在引号内使用引号,则使用反斜杠替换。 此外,如果我们要打印 \
字符,我们必须在其前面加上额外的反斜杠。 \b
被替换为退格键。
$ ./backslash.tcl This was a "great" experience The \ character is the backslash character 200 miles
运行示例。
注释
注释供人类使用以阐明源代码。 在 Tcl 中,注释以 #
字符开头。
# example of a puts command puts "Tcl language"
tclsh
会忽略 #
字符之后的所有字符。
puts "Tcl language" ; # example of a puts command
内联注释只有在使用分号时才有可能。
空格
空格用于分隔 Tcl 源代码中的单词。 它也用于提高源代码的可读性。
set name Jane
set
命令接受两个参数,这两个参数用空格分隔。
set age 32 set name Robert set occupation programmer
如果我们想提高源代码的清晰度,我们可以使用更多的空格。
set vals { 1 2 3 4 5 6 7 } puts $vals
空格用于分隔 Tcl 列表中的项目。 在基于 C 的语言中,我们将使用逗号字符。
变量
一个变量是一个保存值的标识符。 在编程中,我们说我们将一个值分配或设置给一个变量。 从技术上讲,变量是对存储值的计算机内存的引用。 变量名区分大小写。 这意味着 Name
、name
和 NAME
指的是三个不同的变量。
Tcl 中的变量是用 set
命令创建的。 要获取变量的值,其名称前缀为 $
字符。
#!/usr/bin/tclsh set name Jane set Name Julia set NAME Erika puts $name puts $Name puts $NAME
在上面的脚本中,我们设置了三个变量。 变量名相同,只是大小写不同。 但是,不建议这样做。
$ ./case.tcl Jane Julia Erika
大括号
大括号 {}
在 Tcl 中具有特殊含义。 大括号内禁用了单词的替换。
#!/usr/bin/tclsh set name {Julia Novak} puts $name puts "Her name is $name" puts {Her name is $name}
这是一个小脚本,显示了 Tcl 中大括号的用法。
set name {Julia Novak}
大括号可以代替双引号,用于设置用空格分隔的字符串。
puts "Her name is $name"
这里,变量被替换。
puts {Her name is $name}
使用大括号时,变量不会被替换。 所有内容都按字面意思打印出来。
$ ./braces.tcl Julia Novak Her name is Julia Novak Her name is $name
#!/usr/bin/tclsh set numbers { 1 2 3 4 5 6 7 } puts $numbers puts "Braces {} are reserved characters in Tcl" puts {Braces {} are reserved characters in Tcl}
大括号用于创建列表。 列表是 Tcl 中的一种基本数据类型。
set numbers { 1 2 3 4 5 6 7 }
这里创建了一个数字列表。
puts "Braces {} are reserved characters in Tcl" puts {Braces {} are reserved characters in Tcl}
双引号内或其它大括号内的大括号被视为普通字符,没有特殊含义。
$ ./braces2.tcl 1 2 3 4 5 6 7 Braces {} are reserved characters in Tcl Braces {} are reserved characters in Tcl
方括号
方括号 []
用于创建嵌套命令。 这些嵌套命令在 Tcl 源代码行上的主命令之前执行。 它们用于将一个命令的结果作为参数传递给另一个命令。
#!/usr/bin/tclsh set cwd [pwd] puts $cwd puts [clock format [clock seconds] -format "%Y-%m-%d %T"]
在上面的代码示例中,我们展示了一些嵌套命令。
set cwd [pwd]
pwd
命令返回脚本的当前工作目录。 它被放在方括号之间,这使它成为一个嵌套命令。 首先执行 pwd
命令,然后将命令的结果设置为 cwd
变量。
puts [clock format [clock seconds] -format "%Y-%m-%d %T"]
嵌套命令可以嵌套在其他嵌套命令中。 首先,执行 clock seconds
。 它以秒为单位返回当前的本地时间。 结果被传递给 clock format
命令,该命令以可读形式格式化时间。 最后,格式化的时间被返回给 puts
命令,该命令将其打印到控制台。
$ ./nested.tcl /home/janbodnar/prog/tcl/lexis 2015-01-16 16:45:04
引号
双引号将单词组合成命令的单个参数。 美元符号、方括号和反斜杠在引号内被解释。
#!/usr/bin/tclsh set distro Ubuntu puts "The Linux distribution name is $distro" puts "The current working directory: [pwd]" puts "2000000\b\b\b miles"
这是一个在 Tcl 中使用引号的实际例子。
puts "The Linux distribution name is $distro"
变量 distro 在引号字符内被评估。 $distro
被替换为 "Ubuntu"。
puts "The current working directory: [pwd]"
方括号内的命令也被解释。 在这里,我们使用 pwd
命令获取当前工作目录。
puts "2000000\b\b\b miles"
\b
转义序列删除前一个字符。 在我们的例子中,删除了三个零。
$ ./quotes.tcl The Linux distribution name is Ubuntu The current working directory: /home/janbodnar/prog/tcl/lexis 2000 miles
反斜杠
反斜杠字符可以在 Tcl 中以三种不同的方式使用。 它引入了一些特殊字符,称为转义序列。 这些可以是换行符、制表符、退格键等。 它转义了特殊 Tcl 字符($, {}, "", \,
)的含义。 最后,它可以作为行延续字符。
#!/usr/bin/tclsh puts "0\t1" set name Jane puts \$name puts \\$name puts "He said: \"There are plenty of them\"" puts "There are currently many Linux\ distributions in the world"
上面的脚本显示了如何在 Tcl 中使用反斜杠字符。
puts "0\t1"
\t
字符在 Tcl 中具有特殊含义。 它代表一个制表符空格字符。 当我们执行脚本时,在 0 和 1 之间放置 8 个空格。
puts \$name
使用反斜杠,我们转义了美元符号的含义。 在我们的例子中,字符 $name
被打印到控制台。
puts \\$name
反斜杠也可以被转义。 在这里,反斜杠字符和 name 变量的值被打印到控制台。
puts "He said: \"There are plenty of them\""
我们可以通过转义内部双引号的含义来形成直接的演讲。
puts "There are currently many Linux\ distributions in the world"
如果源代码行太宽,我们可以使用反斜杠字符在下一行继续,转义换行符。
$ ./backslash.tcl 0 1 $name \Jane He said: "There are plenty of them" There are currently many Linux distributions in the world
运行示例。
圆括号
圆括号用于指示数组下标或更改 expr
命令的运算符优先级。
#!/usr/bin/tclsh set names(1) Jane set names(2) Robert puts $names(1) puts $names(2) puts [expr (1+3)*5]
这是一个使用 Tcl 中的圆括号的简单示例。
puts $names(1)
我们使用圆括号通过圆括号内指定的键来访问值。
puts [expr (1+3)*5]
这里,我们更改了运算符的优先级。 首先将 1 和 3 相加,然后将结果乘以 5。
$ ./roundb.tcl Jane Robert 20
在本章中,我们描述了 Tcl 语言的词法。