原文: https://zetcode.com/lang/tcl/lexis/

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

命令

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

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

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

  1. puts "Tcl language"

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

  1. #!/usr/bin/tclsh
  2. puts zetcode.com; puts androida.co
  3. puts zetcode
  4. puts androida

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

替换

Tcl 中存在三种替换。

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

方括号用于命令替换。

  1. % puts [expr 1+2]
  2. 3

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

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

  1. #!/usr/bin/tclsh
  2. set name Jane
  3. puts name
  4. puts $name

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

  1. puts name

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

  1. puts $name

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

  1. $ ./name.tcl
  2. name
  3. Jane

这是示例的输出。

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

  1. % puts "This is \t Sparta"
  2. This is Sparta

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

  1. #!/usr/bin/tclsh
  2. puts "This was a \"great\" experience"
  3. puts "The \\ character is the backslash character"
  4. puts "20000\b\b miles"

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

  1. $ ./backslash.tcl
  2. This was a "great" experience
  3. The \ character is the backslash character
  4. 200 miles

运行示例。

注释

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

  1. # example of a puts command
  2. puts "Tcl language"

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

  1. puts "Tcl language" ; # example of a puts command

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

空格

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

  1. set name Jane

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

  1. set age 32
  2. set name Robert
  3. set occupation programmer

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

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

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

变量

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

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

  1. #!/usr/bin/tclsh
  2. set name Jane
  3. set Name Julia
  4. set NAME Erika
  5. puts $name
  6. puts $Name
  7. puts $NAME

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

  1. $ ./case.tcl
  2. Jane
  3. Julia
  4. Erika

这是case.tcl脚本的输出。

大括号

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

  1. #!/usr/bin/tclsh
  2. set name {Julia Novak}
  3. puts $name
  4. puts "Her name is $name"
  5. puts {Her name is $name}

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

  1. set name {Julia Novak}

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

  1. puts "Her name is $name"

在此变量被替换。

  1. puts {Her name is $name}

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

  1. $ ./braces.tcl
  2. Julia Novak
  3. Her name is Julia Novak
  4. Her name is $name

braces.tcl脚本的输出。

  1. #!/usr/bin/tclsh
  2. set numbers { 1 2 3 4 5 6 7 }
  3. puts $numbers
  4. puts "Braces {} are reserved characters in Tcl"
  5. puts {Braces {} are reserved characters in Tcl}

大括号用于创建列表。 列表是 Tcl 中的基本数据类型。

  1. set numbers { 1 2 3 4 5 6 7 }

在此处创建数字列表。

  1. puts "Braces {} are reserved characters in Tcl"
  2. puts {Braces {} are reserved characters in Tcl}

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

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

braces2.tcl脚本的输出。

方括号

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

  1. #!/usr/bin/tclsh
  2. set cwd [pwd]
  3. puts $cwd
  4. puts [clock format [clock seconds] -format "%Y-%m-%d %T"]

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

  1. set cwd [pwd]

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

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

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

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

示例的输出。

双引号

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

  1. #!/usr/bin/tclsh
  2. set distro Ubuntu
  3. puts "The Linux distribution name is $distro"
  4. puts "The current working directory: [pwd]"
  5. puts "2000000\b\b\b miles"

这是在 Tcl 中使用引号的实际示例。

  1. puts "The Linux distribution name is $distro"

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

  1. puts "The current working directory: [pwd]"

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

  1. puts "2000000\b\b\b miles"

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

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

quotes.tcl示例的输出。

反斜杠

反斜杠字符可以在 Tcl 中以三种不同的方式使用。 它引入了一些特殊字符,称为转义序列。 这些可以是换行符,选项卡,退格键等等。 它转义了特殊 Tcl 字符($, {}, "", \, ())的含义。 最后,它可以用作换行符。

  1. #!/usr/bin/tclsh
  2. puts "0\t1"
  3. set name Jane
  4. puts \$name
  5. puts \\$name
  6. puts "He said: \"There are plenty of them\""
  7. puts "There are currently many Linux\
  8. distributions in the world"

上面的脚本显示了如何在 Tcl 中使用反斜杠字符。

  1. puts "0\t1"

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

  1. puts \$name

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

  1. puts \\$name

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

  1. puts "He said: \"There are plenty of them\""

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

  1. puts "There are currently many Linux\
  2. distributions in the world"

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

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

运行示例。

圆括号

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

  1. #!/usr/bin/tclsh
  2. set names(1) Jane
  3. set names(2) Robert
  4. puts $names(1)
  5. puts $names(2)
  6. puts [expr (1+3)*5]

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

  1. puts $names(1)

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

  1. puts [expr (1+3)*5]

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

  1. $ ./roundb.tcl
  2. Jane
  3. Robert
  4. 20

这是round.tcl脚本的输出。

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