Tcl-脚本语言基础

Tcl 官方文档
Tcl 官方 Tutorial

介绍

Tcl, Tool Command Language, 是一种简单的脚本语言, 常集成到其他应用.

安装

在 Archlinux 上, 安装为:

1
sudo pacman -S tcl tk

(Tk 是基于 Tcl 的一个用于构建图形界面的工具包, 使得用户可以通过简单的 Tcl 脚本创建窗口应用程序)

测试, 在 hello.tcl 文件中写入:

1
puts "Hello, Tcl!"

之后:

1
2
$ tclsh hello.tcl
Hello, Tcl!

tclsh 则是 Tcl 的解释器, 一般 Tcl 程序都用 .tcl 的扩展名.

另一个解释器是 wish (Windowing SHell, 怎么用的暂时不谈吧).

语法

Tcl 脚本主要由 commands 构成, 这些 commands 一部分来自 Tcl interpreter (builtin commands), 另一部分则来自于 extension 机制 (Tcl 提供 APIs, 其他语言来实现, 比如 C/C++), 还有一部分来自 proc 命令的构建.

可以在 tclsh 里交互查看结果:

1
2
3
4
5
$ tclsh
%
% expr 20 + 10
30
% exit

expr command 用于进行数学运算.

任何 Tcl command 都会返回结果, 有些 result 用处不大则是返回的空字符串.

注释

# 为注释, 可以用 ; 来分隔 commands.

变量

set command 来赋值以及取值, 赋值如:

1
set x 32

取值如:

1
set x

Tcl 中的变量没有类型, 每个变量都可以存储任意值.

使用变量则需要用 $ 符号;

1
expr $x*3

甚至可以用变量表示 command:

1
2
3
set cmd expr
set x 11
$cmd $x*$x

Command substitution

即把一个指令的结果作为另一个指令的输入:

1
2
set x 50
set b [expr $x*4]

双引号和花括号

在双引号中用 $ 相当于是变量插值, 其中的 [] 也会计算出结果, 比如:

1
2
3
set x 24
set y 18
set z "$x + $y is [expr $x + $y]"

若要避免变量插值以及 [] 的计算, 可以用 {} 包裹:

1
set z {$x + $y is [expr $x + $y]}

控制语句

比如定义一个 procedure (也就是函数):

1
2
3
4
5
6
7
8
proc power {base p} {
set result 1
while { $p > 0 } {
set result [expr $result * $base]
set p [expr $p - 1]
}
return $result
}
  • proc command 接受三个参数
    • procedure 名
    • 参数列表
    • procedure 主体
  • while 表明循环
  • result 指定返回值

此时可以调用如:

1
2
power 2 6
power 1.15 5

打印输出

puts command, 其会默认追加换行符.

1
2
3
4
5
6
7
8
9
10
11
puts "Hello, World - In quotes"    ;# This is a comment after the command.
# This is a comment at beginning of a line
puts {Hello, World - In Braces}
puts {Bad comment syntax example} # *Error* - there is no semicolon!

puts "This is line 1"; puts "this is line 2"

puts "Hello, World; - With a semicolon inside the quotes"

# Words don't need to be quoted unless they contain white space:
puts HelloWorld

数学运算

expr 能处理所有标准的数学符号, 逻辑符号, 位运算以及一些数学函数如 rand(), sqrt(), cosh() 等.

一个技巧, 用 {} 包裹 expr 的参数计算速度更快:

1
expr {10 * 10}

字符串的比较用 eqne, 数字用 ==!=, 可以用 inni 来判断是否在列表中.

expr 中也能结合 commands:

1
2
3
set x 1
set w "Abcdef"
puts [expr { [string length $w]-2*$x }]

类型转换

用四个函数:

  • double()
  • int()
  • wide(), 一个更大的 integer
  • entier(), 一个合适的 integer

进度

暂时看到 https://www.tcl.tk/man/tcl8.5/tutorial/Tcl7.html 了, 以后可补齐.


Tcl-脚本语言基础
http://example.com/2024/11/03/Tcl-脚本语言基础/
作者
Jie
发布于
2024年11月3日
许可协议