# Tcl 语法结构

> 原文： [https://zetcode.com/lang/tcl/lexis/](https://zetcode.com/lang/tcl/lexis/)

像人类语言一样，计算机语言也具有词汇结构。 Tcl 语言的词汇包括基本元素和适用于它们的规则。 单词是 Tcl 中的基本元素。 单词可以是命令，也可以是命令参数。 替换是 Tcl 语法的基本规则之一。

## 命令

Tcl 是基于字符串的解释命令语言。 Tcl 脚本由命令组成，这些命令由换行符或分号分隔。 命令是基本的执行元素。 命令后跟一个或多个单词（作为参数）。 每个参数都由空格分隔。

Tcl 命令的格式如下：`command arg1 arg2 arg3 ...` Tcl 解释器接受句子的每个单词并对其求值。 第一个单词被认为是命令。 大多数 Tcl 命令是可变的。 这意味着它们可以处理可变数量的参数。

解析 Tcl 脚本后，将求值命令。 每个命令在其自己的上下文中解释单词。

```tcl
puts "Tcl language"

```

在上面的代码摘录中，我们具有`puts`命令。 此命令将消息打印到控制台。 `"Tcl language"`是正在打印的字符串。 与其他语言不同，字符串不能用双引号引起来； 除非有空白。

```tcl
#!/usr/bin/tclsh

puts zetcode.com; puts androida.co

puts zetcode
puts androida

```

在第一种情况下，命令用分号`;`字符分隔。 在第二种情况下，它们之间用换行符分隔。

## 替换

Tcl 中存在三种替换。

*   命令替换
*   变量替换
*   反斜杠替换

方括号用于命令替换。

```tcl
% puts [expr 1+2]
3

```

`expr`命令用于执行算术计算。 首先，求值方括号之间的命令，并将结果返回到`puts`命令。 然后，`puts`命令求值结果并将其打印到控制台。

如果单词包含美元符号`$`，则 Tcl 执行变量替换。 单词中的美元符号和以下字符由变量的值替换。

```tcl
#!/usr/bin/tclsh

set name Jane

puts name
puts $name

```

我们创建一个名为`name`的变量，并为其设置一个值。

```tcl
puts name

```

在这种情况下，我们将字符串`name`打印到控制台。

```tcl
puts $name

```

在第二种情况下，参数以`$`字符开头。 `name`变量的值被打印到控制台。

```tcl
$ ./name.tcl 
name
Jane

```

这是示例的输出。

通过反斜杠替换，我们可以摆脱字符的原始含义。 例如，`\n`代表换行，`\t`是制表符。

```tcl
% puts "This is \t Sparta"
This is          Sparta

```

在这里，`\t`序列被制表符代替。

```tcl
#!/usr/bin/tclsh

puts "This was a \"great\" experience"
puts "The \\ character is the backslash character"

puts "20000\b\b miles"

```

如果要在引号字符中包含引号，请使用反斜杠替换。 另外，如果要打印`\`字符，则必须在其前面加上其他反斜杠。 `\b`替换为退格键。

```tcl
$ ./backslash.tcl 
This was a "great" experience
The \ character is the backslash character
200 miles

```

运行示例。

## 注释

人们使用注释来澄清源代码。 在 Tcl 中，注释以`#`字符开头。

```tcl
# example of a puts command
puts "Tcl language"

```

`tclsh`会忽略`#`字符之后的所有字符。

```tcl
puts "Tcl language" ; # example of a puts command

```

仅当使用分号时才可以进行内联注释。

## 空格

空白用于分隔 Tcl 源中的单词。 它还用于提高源代码的可读性。

```tcl
set name Jane

```

`set`命令采用两个参数，两个参数之间用空格隔开。

```tcl
set age        32
set name       Robert
set occupation programmer

```

如果要提高源代码的清晰度，我们可能会使用更多空间。

```tcl
set vals { 1 2 3 4 5 6 7 }
puts $vals

```

空白用于分隔 Tcl 列表中的项目。 在基于 C 的语言中，我们将使用逗号字符。

## 变量

变量是保存值的标识符。 在编程中，我们说我们为变量分配或设置了一个值。 从技术上讲，变量是对存储值的计算机内存的引用。 变量名称区分大小写。 这意味着`Name`，`name`和`NAME`引用了三个不同的变量。

Tcl 中的变量是使用`set`命令创建的。 要获取变量的值，其名称前面带有`$`字符。

```tcl
#!/usr/bin/tclsh

set name Jane
set Name Julia
set NAME Erika

puts $name
puts $Name
puts $NAME

```

在上面的脚本中，我们设置了三个变量。 变量名称相同，只是大小写不同。 但是，不建议这种做法。

```tcl
$ ./case.tcl 
Jane
Julia
Erika

```

这是`case.tcl`脚本的输出。

## 大括号

大括号`{}`在 Tcl 中具有特殊含义。 大括号内的单词替换已禁用。

```tcl
#!/usr/bin/tclsh

set name {Julia Novak}
puts $name

puts "Her name is $name"
puts {Her name is $name}

```

这是一个小脚本，显示了 Tcl 中花括号的用法。

```tcl
set name {Julia Novak}

```

可以使用大括号代替双引号来设置以空格分隔的字符串。

```tcl
puts "Her name is $name"

```

在此变量被替换。

```tcl
puts {Her name is $name}

```

使用花括号时，变量不会被替换。 一切都按字面意思打印。

```tcl
$ ./braces.tcl 
Julia Novak
Her name is Julia Novak
Her name is $name

```

`braces.tcl`脚本的输出。

```tcl
#!/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 中的基本数据类型。

```tcl
set numbers { 1 2 3 4 5 6 7 }

```

在此处创建数字列表。

```tcl
puts "Braces {} are reserved characters in Tcl"
puts {Braces {} are reserved characters in Tcl}

```

双引号或其他大括号内的大括号被视为常规字符，没有特殊含义。

```tcl
$ ./braces2.tcl 
 1 2 3 4 5 6 7 
Braces {} are reserved characters in Tcl
Braces {} are reserved characters in Tcl

```

`braces2.tcl`脚本的输出。

## 方括号

方括号`[]`用于创建嵌套命令。 这些嵌套命令在 Tcl 源代码行上的 main 命令之前执行。 它们用于将一个命令的结果作为参数传递给另一命令。

```tcl
#!/usr/bin/tclsh

set cwd [pwd]
puts $cwd

puts [clock format [clock seconds] -format "%Y-%m-%d %T"]

```

在上面的代码示例中，我们显示了一些嵌套命令。

```tcl
set cwd [pwd]

```

`pwd`命令返回脚本的当前工作目录。 它放在方括号之间，使其成为嵌套命令。 首先执行`pwd`命令，然后将命令的结果设置为`cwd`变量。

```tcl
puts [clock format [clock seconds] -format "%Y-%m-%d %T"]

```

嵌套命令可以嵌套在其他嵌套命令中。 首先，执行`clock seconds`。 它以秒为单位返回当前本地时间。 结果传递到`clock format`命令，该命令以可读形式格式化时间。 最后，格式化的时间返回到`puts`命令，该命令将其打印到控制台。

```tcl
$ ./nested.tcl 
/home/janbodnar/prog/tcl/lexis
2015-01-16 16:45:04

```

示例的输出。

## 双引号

双引号将单词组合为命令的单个参数。 美元符号，方括号和反斜杠在引号内解释。

```tcl
#!/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 中使用引号的实际示例。

```tcl
puts "The Linux distribution name is $distro"

```

变量发行版在引号字符内求值。 `$distro`被替换为`"Ubuntu"`。

```tcl
puts "The current working directory: [pwd]"

```

方括号内的命令也会被解释。 在这里，我们使用`pwd`命令获取当前的工作目录。

```tcl
puts "2000000\b\b\b miles"

```

`\b`转义序列删除前一个字符。 在我们的例子中，三个零被删除。

```tcl
$ ./quotes.tcl 
The Linux distribution name is Ubuntu
The current working directory: /home/janbodnar/prog/tcl/lexis
2000 miles

```

`quotes.tcl`示例的输出。

## 反斜杠

反斜杠字符可以在 Tcl 中以三种不同的方式使用。 它引入了一些特殊字符，称为转义序列。 这些可以是换行符，选项卡，退格键等等。 它转义了特殊 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 中使用反斜杠字符。

```tcl
puts "0\t1"

```

`\t`字符在 Tcl 中具有特殊含义。 它代表制表符空白字符。 当我们执行脚本时，在 0 和 1 内放置 8 个空格。

```tcl
puts \$name

```

有了反斜杠，我们就可以摆脱美元符号的含义。 在我们的情况下，将`$name`字符打印到控制台。

```tcl
puts \\$name

```

反斜杠也可以转义。 这里，反斜杠字符和`name`变量的值被打印到控制台。

```tcl
puts "He said: \"There are plenty of them\""

```

我们可以通过转义内部双引号的含义来形成直接语音。

```tcl
puts "There are currently many Linux\
distributions in the world"

```

如果源行太宽，我们可以使用反斜杠字符继续下一行，转义换行符。

```tcl
$ ./backslash.tcl 
0       1
$name
\Jane
He said: "There are plenty of them"
There are currently many Linux distributions in the world

```

运行示例。

## 圆括号

圆括号用于指示数组下标或更改`expr`命令的运算符的优先级。

```tcl
#!/usr/bin/tclsh

set names(1) Jane
set names(2) Robert

puts $names(1)
puts $names(2)

puts [expr (1+3)*5]

```

这是一个简单的示例，在 Tcl 中带有圆括号。

```tcl
puts $names(1)

```

我们使用圆括号通过圆括号内指定的键访问值。

```tcl
puts [expr (1+3)*5]

```

在这里，我们更改了运算符的优先级。 首先将 1 和 3 相加，然后将结果乘以 5。

```tcl
$ ./roundb.tcl 
Jane
Robert
20

```

这是`round.tcl`脚本的输出。

在本章中，我们描述了 Tcl 语言的词汇。