2022年的Tcl编程语言入门参考 1:语法

您所在的位置:网站首页 tcl小t功能 2022年的Tcl编程语言入门参考 1:语法

2022年的Tcl编程语言入门参考 1:语法

2024-01-18 05:44| 来源: 网络整理| 查看: 265

这是我之前录制的《编程拾荒 TCL/TK》系列视频的文字修订版,做了一些补充、修正和删减。

前置声明

好奇点进来的,可以直接退出了🤝。如果有中国冷门语言排行榜的话,Tcl肯定榜上有名。谈论其它语言都是适合/不适合做什么,谈Tcl都是还有哪些地方在用它。所以除非你知道自己在干什么,否则不建议继续阅读。

另:如果初学编程感到绝望,倒也不反对你在Tcl/Tk这棵树上再试一次😂……因为它涉及的知识概念比其它语言要少

推荐学习路线图

针对windows编程初学者,建议:

先了解"命令提示符"的常用命令和运行方式

学习一些bat批处理命令、PowerShell的基础知识

掌握Tcl语法和常用部分

学习Tk(编写带图形界面的程序)

freewrap(把Tcl/Tk源代码打包成单个执行程序,跨平台)

根据具体需求继续学习

命令提示符可以让初学者掌握命令行交互模式;批处理命令、PowerShell可以了解编程与自动化的工作模式,这两方面的学习投资长期有效。

Tcl语言的语法与命令行类似,因为用途少,只需要掌握基本语法和功能即可。Tk图形库虽然在今天没有什么优势,但基础部分跟流行的图形库是相通的,此外Tk还是Python的内嵌图形库,至少还有用武之地。freewrap可以生成无需安装的单一可执行程序,方便分发、部署到其它电脑上。

另:👨‍💻对于熟练的Linux/Unix/FreeBSD使用者来说,仅凭官网资料+翻译软件就足够了。

对于程序员而言

Tcl/Tk是由C编写的典型工具语言:专注于解决具体问题,不太关心语言发展的可能性。Tcl就像是用C语言编写的工具包,而流行的语言更接近于一个平台。Tcl/Tk专注于实用,抽象类功能发展的非常慢,比如直到8.6版才加入官方面向对象支持。其它语言的扩展库大部分都是用自身编写的,Tcl一半以上的库都是用C语言编写的(真·硬核扩展)。

Tcl代码偏向于快速解决具体需求,而不擅长归类、抽象与算法。此外,大段代码的可读性不佳,多业务逻辑的代码更是害人害己;但是对于Tcl可以解决的具体问题,代码非常简短,比如:借助 twapi 库编写的win系统鼠标点击器(按顺序依次点击固定点位)只须几十行。

语法

TCL语言诞生于1988年,那还是UNIX和DOS系统的时代,那时主要通过敲命令(以“命令+空格+参数”的形式)来控制系统。当时主要使用C语言,但是C语言的入门难度太高了,为了降低编程的难度,John K. Ousterhout开发了TCL语言。TCL诞生的目的就是为了降低编程的难度,所以选择了跟命令一样的语法,让计算机操作员可以直接进化成程序猿。

💾官方文档:https://tcl.tk/man/tcl8.6/TclCmd/Tcl.htm

提醒:语法部分涉及的多个概念会在各自的章节中详细介绍

最基本的语法形式:命令 参数1 参数2 参数3 ....

其中空白字符(空格/tab)用来分割命令和参数,并且允许多个连续空白字符。命令加上所有的参数,被称呼为一条语句。 语句的结束用换行或者是英文分号表示。参数分为"预设"和"人为指定"两种,"预设参数"是预先设定好的参数,用于调整命令的具体工作方式;"人为指定"就是我们给出的内容。

注:Tcl语言的"命令"跟其它语言的"函数"、"方法"、"过程"是类似的概念,每个命令都有具体的功能。

# 用于代码注释,也就是在代码里写一些给码农看的说明(不影响代码运行)

字符串

Tcl代码中所有内容都被当做字符串(包括数字),语句中的命令跟参数也都是字符串,Tcl只是把语句中的第一段字符串当作命令、后续字符串当成参数而已。相较其它语言来说,Tcl语言涉及的知识点很少。当然这种简洁是有代价的,Tcl语言在执行时会把字符串转换成合适的数据类型(比如整数、浮点数……)所以执行效率不高(反正也没人用它做数据计算)。

字符串的表现方式有三种,一默认就被当作字符串,二英文双引号,三大括号{}

默认:直接书写的字符串,限制:不能有空格、不能换行、不能包含在语法层面引起歧义的字符

"":编程语言普遍使用的字符串表现形式,可以包含空格,可以换行,可以执行转义和替换操作(后续介绍)

{}:与双引号类似,但不会对字符串进行替换和转义,可以包含多种特殊字符,支持嵌套{}。如果出现单个的大括号,则会导致语法错误。特殊规则:对转义字符串 \{ 和 \} 不会当作单个大括号报错,但也不会转义。

注:字符串区分大小写,即Tcl语言区分大小写

替换

替换语法包括变量替换和命令替换,用于在字符串中根据规则替换字符

变量替换

除{}之外的字符串中以$开头的单词将进行变量替换,即把变量的值放到"$变量名"所在的位置。实际作用类似于其它语言的变量调用。

命令替换

中括号 [ ] 里的内容将被视为代码(可以包含任意多条语句)其中最后一条语句的执行结果将被放到 [] 所在的位置。嵌套的 [ ] 会先处理最里面的语句,但要注意这其实不算优先级,因为流程是:发现首个 [ 时,中括号内的内容视为语句,为了进行替换操作,先处理 [ ] 里的语句;然后在语句中又发现了 [ ,于是为了进行替换操作就再处理里面的语句——所有的过程都是为了进行替换操作。

转义

转义也可以看作是一种替换,但是在其它语言中都有转义语法,所以单独介绍了。转义的作用是在字符串中插入特殊字符或者消除字符在语句中的歧义,比如在字符串中包含英文引号、分号或大括号。

注:好奇心旺盛的朋友会发现上例中美元符号即便不转义也可以正常使用,这是因为字符串中美元符号后面紧跟的不是英文和数字(将在变量部分介绍)。虽然在中文中可以正常使用,但还是建议养成良好习惯,编程时少玩特例(信息安全专业除外)

结尾换行

语句在一行的末尾写 \ 斜杠,然后换行,表示下一行也是该条语句。

非英文字符

Tcl/Tk中非英文字符统一使用unicode编码,这是官方设定,当然也有一些变通:👍自定义命令名可以直接使用中文,不影响运行😶变量名可以使用中文,但在使用时要用大括号括起来 ${变量名} 否则有可能导致报错😑win系统:把源代码的编码设为系统编码,可以直接使用中文,但在不同系统或不同解释器时,有可能因编码不匹配报错

原则:如果代码只给自己用随便,如果给别人用最好遵守官方文档

参数扩展

这是8.6版新加的高级语法,需要先了解列表才能理解,也被翻译为"参数展开"

正常情况下,我们将列表作为参数时,整个列表会被视为一个参数。但是很多情况下这是不行的,该语法将{*}后面紧接着的非空白内容视为一个列表,把列表的内容放在 {*} 所在的位置,并将列表中的每个元素都视为参数(相当于把列表拆开了)。

执行方式

Tcl语言解释器(tclsh、wish等)读取Tcl代码,以换行或英文分号来识别语句的结尾。✂读取完一条语句之后,根据空白字符(空格或tab)将语句拆分成多个段🖨依次处理各个段,按规则执行替换操作🕹第一段(即第一个单词)会被视为命令,后续各段都视为参数🔍解释器查找是否有这个命令,如果有就把参数传递给命令;如果没有就报错🧾执行完毕后,如果本条语句的作用不是中断执行或退出的话,继续处理下一条语句

语法小测验

🕵满满的恶意……

set set set是我在官方Wiki(https://wiki.tcl-lang.org/)上看到的语法文章,Tcl/Tk的社区中,经常可以看到对某些命令的魔法应用,但也正因为语言发展带来的复杂性,摧毁了逻辑层面上的简洁;图形化时代到来,命令式语法对于初学者也成了负担——最终导致优势不复存在。加之Tcl本身定位就不适合进行功能扩展,所以走向没落也是必然。

推荐书籍

《Tcl/Tk入门经典 (第2版) 》是中文书籍中质量最高、覆盖面最广的Tcl书籍



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3