当前位置:文档之家› TCL语言及其文件的认识、理解和编辑

TCL语言及其文件的认识、理解和编辑

TCL语言及其文件的认识、理解和编辑欢迎大家指正和补充。

Tcl语法简介Tcl是用于工具命令语言的一个解释器。

它由作为基本命令解释器嵌入到工具(比如编辑器、调试器等)中的一个库包组成。

Tcl提供了(a)用于简单的文本命令语言的分析器,(b)一组内置的实用命令,和(c)一个C 接口,工具通过它用特定于工具的命令增加内置命令。

Tcl在与窗口组件库整合的时候特别有吸引力:它通过了提供变量、过程、表达式等机制增进了组件的可编程性;它允许用户编程组件的外观和动作二者;并且它在交互式程序之间提供一个简单但强力的通信机制作为一种脚本语言,Tcl具有简单的语法Tcl/Tk 的发明人John Ousterhout 教授在八十年代初,是伯克利大学的教授。

在其教学过程中,他发现在集成电路CAD 设计中,很多时间是花在编程建立测试环境上。

并且,环境一旦发生了变化,就要重新修改代码以适应。

这种费力而又低效的方法,迫使Ousterhout 教授力图寻找一种新的编程语言,它即要有好的代码可重用性,又要简单易学,这样就促成了Tcl (Tool Command Language) 语言的产生。

Tcl最初的构想的是希望把编程按照基于组件的方法(component approach),即与其为单个的应用程序编写成百上千行的程序代码,不如寻找一个种方法将程序分割成一个个小的, 具备一定“完整”功能的,可重复使用的组件。

这些小的组件小到可以基本满足一些独立的应用程序的需求,其它部分可由这些小的组件功能基础上生成。

不同的组件有不同的功能,用于不同的目的。

并可为其它的应用程序所利用。

当然, 这种语言还要有良好的扩展性, 以便用户为其增添新的功能模块。

最后,需要用一种强的,灵活的“胶水”把这些组件“粘”合在一起, 使各个组件之间可互相“通信”,协同工作。

程序设计有如拼图游戏一样,这种设计思想与后来的Java 不谋而合。

终于在1988 年的春天, 这种强大灵活的胶水- Tcl语言被发明出来了。

按照Ousterhout 教授的定义,Tcl是一种可嵌入的命令脚本化语言(Command Script Language)。

“可嵌入”是指把很多应用有效,无缝地集成在一起。

“命令”是指每一条Tcl 语句都可以理解成命令加参数的形式:命令[参数1] [参数2] [参数3] [参数4] ...... [参数N]脚本化是指Tcl为特殊的,特定的任务所设计。

但从现在角度看,可以说Tcl是一种集C 语言灵活强大的功能与BASIC 语言易学高效的风格于一身的通用程序设计语言。

Tk (Tool Kit) 是基于Tcl的图形程序开发工具箱, 是Tcl的重要扩展部分。

Tk 隐含许多C/C++ 程序员需要了解的程序设计细节, 可快速地开发基于图形界面Windows 的程序。

据称, 用Tcl/Tk 开发一个简单的GUI 应用程序只需几个小时, 比用C/C++ 要提高效率十倍。

需要指明的是这里所说的“窗口”是指Tcl定义的窗口,与X-Windows 与MS Windows 的定义有所不同,但它可完美地运行在以上两个系统上。

Tcl代表了“tool command language - 工具命令语言”。

它由一个库包组成,程序可以把它用作自己的命令语言的基础。

Tcl的开发由两项观察所推动。

第一项观察是,通用可编程命令语言通过允许用户用命令语言写程序来扩展工具的内置设施,从而扩大了工具的能力。

在强力的命令语言之中最众所周知的例子是UNIX shell[5] 和Emacs 编辑器[8]。

在各自情况下,出现的有着不同寻常能力的计算环境,在很大程度上是因为能获得可编程的命令语言。

第二个促成它的观察是交互式应用正在增长。

在1970 年代晚期和1980 年代早期的分时环境中,几乎所有的程序都是面向批处理的。

典型的使用交互式的命令shell 来调用它们。

除了shell 之外,只有少数其他的程序是交互式的,比如编辑器和邮件器。

正好相反,今天使用的个人工作站,带有它们自己的光栅显示器和鼠标,鼓励了一种不同的系统结构,在这里大量的程序是交互式的,并且最常见的交互方式是直接用鼠标操纵单独的应用。

此外,今天能获得的大显示器使很多交互式的应用立即活跃起来成为可能,而对于在十年前很小的屏幕这是不实际的。

不幸的是,很少的今天的交互式程序拥有shell 或Emacs 命令语言的能力。

在这里好的命令语言是存在着的,它们趋向与特定的程序捆绑在一起。

每个新的交互式程序都要求开发一个新的命令语言。

在多数情况下,应用程序员没有时间或爱好去实现一个通用设施(特别是在应用自身很简单的时候),所以结果的命令语言趋向于带有不充分的功能和笨拙的语法。

Tcl是一个独立于应用的命令语言。

它作为一个C 库包存在,可以用于很多不同的程序中。

Tcl库提供了用于简单但完全可编程的命令语言的一个分析器。

这个库还实现了提供了通用的编程构造的一组内置命令,比如变量、列表、表达式、条件、循环和过程。

单个的应用程序可以用特定于应用的命令来扩展基本的Tcl语言。

Tcl库还提供一组实用工具例程来简化特定于工具的命令的实现。

我相信Tcl在窗口环境中是特别有用的,它提供了两项优势。

首先,它可以用做编制应用的界面的一个通用机制。

如果一个工具基于Tcl,则应当相对容易的去修改应用的用户界面,并使用新命令来扩展这个界面。

其次和更重要的是,Tcl为工具之间通信提供一种统一的框架。

如果在所有的工具中统一使用了它,Tcl将使工具在一起工作得比今天的状况更加优雅。

Tcl是不寻常的因为它提供两种不同的接口: 给用户发起Tcl命令的一个文本接口,和给它所嵌入的应用的一个过程接口。

这些接口的每个都必须是简单的、强力的和高效的。

在语言设计中有四个主要的因素:[1] 语言用于命令。

几乎所有Tcl“程序”都是短小的,很多只有一行长。

多数程序将是键入的,执行一次或者几次,接着就丢弃了。

这提示了这门语言应当有一个简单的语法,以便于键入命令。

多数现存的编程语言都有复杂的语法;在写长程序的时候有益,但如果用做命令语言就笨拙了。

[2] 语言必须是可编程的。

它应当包含通用编程构造,比如变量、过程、条件和循环,这样用户可以通过写Tcl过程来扩展内置的命令。

可扩展性也要求简单的语法:这使Tcl程序生成其他Tcl程序变得容易了。

[3] 语言必须允许一个简单而高效的解释器。

由于Tcl库要包含到许多小程序中,特别是在没有共享库的机器上,解释器必须不占用太多的内存。

用来解释Tcl命令的机制必须足够快,可用于每秒发生上百次的事件,比如鼠标移动。

[4] 语言必须允许对C 应用的一个简单接口。

它必须易于让C 应用调用这个解释器,并易于让它们用特定于应用的命令来扩展内置的命令。

这个因素是我决定不使用Lisp 作为命令语言的原因之一:Lisp 的基本数据类型和存储管理机制与C 实在是不同,很难在它们之间建立清晰而简单的接口。

对Tcl我使用了对于C 最自然的数据类型(字符串)。

Tcl的基本语法类似于UNIX shell:命令由用空格或TAB 分隔的一个或多个字段组成。

第一个字段是命令的名字,它可以是内置命令、特定于应用的命令、或者是由一系列的Tcl命令组成的过程。

在第一个后面的字段都作为参数传递给命令。

如同在UNIX shell 中那样,换行字符用做命令分隔符,分号也可用来分隔在同一行上的命令。

不同于UNIX shell,每个Tcl命令返回一个字符串结果,或者是空串,如果不适宜返回值的话。

在Tcl中有四个补充的语法构造,它们给予语言一种类似Lisp 的风格。

使用花括号来组合复杂的参数;它们充当可嵌套的引用字符。

如果参数的第一个字符是左花括号,则这个参数不以空白终结。

转而,它终结于相匹配的右花括号。

传递给这个命令的参数由在花括号中间的所有东西组成,并剥除围绕的花括号。

例如,命令set a {dog cat {horse cow mule} bear}将收到两个参数:“a”和“dog cat {horse cow mule} bear”。

这个特定命令将把变量 a 设置为等于第二个参数的一个字符串。

如果参数包围在花括号中,则不对这个参数做下面描述的其他替换。

花括号最常见的用途是把一个Tcl子程序指定为到Tcl命令的参数。

在Tcl中第二个语法构造是是方括号,它用于引发命令替换。

如果在参数中出现了左方括号,则从这个左方括号一直到相匹配的右方括号的所有东西都作为一个命令来对待,并由Tcl解释器递归的执行。

命令的结果接着替换到这个方括号包围的字符串所在的位置上。

例如,考虑命令set a [format {Santa Claus is %s years old} 99]format 命令做类似printf 的格式化并返回字符串“Santa Claus is 99 years old”,接着把它传递给set 并赋值到变量a。

第三个语法构造是美元号,它用于变量替换。

如果它出现在参数中,则随后的字符作为变量的名字对待;变量的内容被替换到参数中这个美元符号和名字所在的位置上。

例如,命令set b 99set a [format {Santa Claus is %s years old} $b]导致a 有同前面段落中的简单命令相同的最终值。

变量替换不是严格必须的,因为有其他方式来达到相同的效果,但是它减少了键入。

最后一个语法构造是反斜杠字符,可以用它把特殊字符插入到参数中,比如花括号或非打印字符。

在Tcl中只有一种数据类型:字符串。

所有命令、到命令的参数、命令返回的结果和变量的值都是ASCII 字符串。

Tcl始终使用字符串便于在Tcl库过程和包围它的应用的C 代码之间来回传递信息。

这使它易于在不同类型的机器之间来回传递有关Tcl的信息。

尽管在Tcl中所有的东西都是字符串,很多命令都希望它们的字符串参数有特定的格式。

这里的字符串有三种特定的通用格式:列表、表达式和命令。

列表只是包含用空白分隔的一个或多个字段的字符串,类似于命令。

可以使用花括来包围复杂的列表元素;这些复杂的列表元素自身经常也是列表,类似于Lisp。

例如,字符串dog cat {horse cow mule} bear是有四个元素的一个列表,其中第三个元素是有三个元素的列表。

Tcl提供一组列表操纵的命令,比如建立列表、提取元素、和计算列表长度。

字符串的第二种常见形式是数值表达式。

Tcl表达式同C 中的表达式有着同样的操作符合优先级。

Tcl命令 expr 把字符串作为表达式来求值并返回结果(当然是作为字符串)。

例如,命令expr {($a < $b) || ($c != 0)}在变量a 小于变量b 或者变量c 是零的时候返回“1”,否则返回“0”。

相关主题