搜索
bottom↓
回复: 14

tcl 简介

[复制链接]

出0入0汤圆

发表于 2011-2-21 15:42:22 | 显示全部楼层 |阅读模式
学timequest 离不开tcl 命令 以下是tcl简介 但也可以用 gui 但学会tcl 对你绝对有帮助的

Tcl编程简介

简介

  Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,功能强大。是tool command language的缩写,发音为 "tickle”, 实际上包含了两个部分:一个语言和一个库。

  首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一 些互交程序如文本编辑器、调试器和shell。它有一个简单的语法 和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。

  其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个分析器、用于执行内建命令的例程和可以使你扩充(定义新的 过程)的库函数。应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的一个输入中读取(按钮或菜单等)。 但Tcl库收到命令后将它分解并执行内建的命令,经常会产生递归的调用。

  下面简单介绍以下txl的语法规则:

解释器

  在Tcl的数据结构中的核心是Tcl_Interp.一个解释器包含了一套命令,一组变量和一些用于描述状态的东西。每一个 Tcl命令是 在特定的Tcl_Interp中运行的,基于Tcl的应用程序可以同时拥有几个Tcl_Interp。Tcl_Interp是一个轻量级的结构,可以快速的新建和删除。

数据类型

  Tcl只支持一种数据结构:字符串(string)。所有的命令,命令的所有的参数,命令的结果,所有的变量都是字符串。请牢记这一点,所有的东西都是字符串。 这是它比较有特点的方面。字符串有三种形式:命令(command), 表达式(expresion)和表(list)。

Basic Command Syntax 基本语法

  Tcl有类似于shell和lisp的语法,当然也有许多的不同。一 条Tcl的命令串包含了一条或多条命令用换行符或分号来隔开,而每一条命令包含了一个域(field)的集合,域使用空白分开的,第一个域是一个命令的名字,其它的是作为参数来传给它。

  例如:

  set a 22 //相当于C中的 a=22
      a是一个变量这条命令分为三个域:
             1: set   
             2: a
             3: 22
      set使用于设置变量的值的命令,a、22 作为参数来传给它,a使它要操作的变量名,22是要付给的a值。

  Tcl的命令名可以是内置的命令也可以是用户建的新命令,如果是用户用户建的新命令应用程序中用函数Tcl_CreateCommand来创建。所有的参数作为字符串来传递,命令自己会按其所需来解释的参数的。命令的名字必须被打全,但 Tcl解释器找不到一同名的命令时会用 unknown命令来代替。

  在很多场合下,unknown 会在库目录中搜寻,找到一个的话,会自动生成一个Tcl命令并调用它。unknown经常完成缩略的命令名的执行。但最好不要使用。

注释

  和shell很象,第一个字母是"#"的Tcl字符串是注释。

其他细节规则

  Grouping arguments with double-quotes 用双引号来集群参数,目的在于使用有空白的参数。

  例如:

set a "this string contains whitespace"  

  如够一个参数一双引号来开始,该参数会一直到下一个双引号才结束。其中可以有换行符和分号。

  Variable substitution with $ 用美元符进行变量替换说白了就是引用该变量。

  如:

set a hello set b $a // b = "hello" 实际上传给set命令的参数 //是b,"hello" set c a // b = "a"

  Command substitution with brackets 命令替换(用方括号)

  例如:

set a [set b "hello"]

  实现执行 set b "hello" 并用其结果来替换源命令 中的方括号部分,产生一条新命令

  set a "hello" //"hello" 为 set b "hello" 的返回值

  最终的结果是b="hello" a="hello"

  当命令的一个子域以方括号开始以方括号结束,表示要进行一个命令替换。并执行该子命令,用其结果来替换原命令中的方括号部分。方括号中的部分都被视为Tcl命令。

  如下一个复杂一点的例子:

set a xyz[set b "abc"][set c "def"] //return xyzabcdef

  Backslash substitution 转移符替换

  转移符时间不可打印字符或由它数意义的字符插入进来。这一概念与C语言中的一样。

 Backspace (0x8). f Form feed (0xc). Newline (0xa). Carriage-return (0xd). Tab (0x9). v Vertical tab (0xb). { Left brace (`{"). } Right brace (`}"). [ Open bracket (`["). ] Close bracket (`]"). $ Dollar sign (`$"). sp Space (` "): does not terminate argument. ; Semicolon: does not terminate command. " Double-quote.

  Grouping arguments with braces 用花扩括号来集群参数

  用花扩括号来集群参数与用双引号来集群参数的区别在于:用花扩括号来集群参数其中的三种上述的子替换不被执行。而且可以嵌套。

  例如:

set a {xyz a {b c d}}//set收到俩个参数 a "xyz a {b c d}" eval { set a 22 set b 33 }//eval收到一个参数 "set a 22set b 33"

命令综述

  1.一个命令就是一个字符串(string)。

  2.命令是用换行符或分号来分隔的。

  3.一个命令由许多的域组成。第一个于是命令名,其它的域作为参数来传递。

  4.域通常是有空白(Tab横向制表健 Space空格)来分开的。

  5.双引号可以使一个参数包括换行符或分号。三种子替换仍然发生。

  6.花括号类似于双引号,只是不进行三总体换。

  7.系统只进行一层子替换,机制替换的结果不会再去做子替换。而且子替换可以在任何一个域进行。

  8.如果第一个非控字符是`#", 这一行的所有东西都是注释。

表达式

  对字符串的一种解释是表达式。几个命令将其参数按表达式处理,如:expr、for 和 if,并调用Tcl表达式处理器(Tcl_ExprLong, Tcl_ExprBoolean等)来处理它们。其中的运算符与C语言的很相似。

!

  逻辑非

* / % + - << >>

  左移 右移 只能用于整数。

< > <= >= == !=

  逻辑比较

& ^ |

  位运算 和 异或 或

&&' '

  逻辑"和" "或"

x ? y : z

  If-then-else 与C的一样

  Tcl 中的逻辑真为1,逻辑假为0。

  一些例子:

5 / 4.0 5 / ( [string length "abcd"] + 0.0 )

  计算字符串的长度 转化为浮点数来计算

"0x03" > "2" "0y" < "0x12"

  都返回 1

列表

  字符串的另一种解释为列表。一个列表是类似于结果的一个字 符串包含了用空白分开的很多域。例如 "Al Sue Anne John" 是 一个有四个元素的例表,在列表中换行父被视为分隔符。例如:

  b c {d e {f g h}} 是一个有三个元素的列表 b 、c 和 {d e {f g h}}。

  Tcl的命令 concat, foreach, lappend, lindex, linsert,list, llength, lrange,lreplace, lsearch, 和 lsort 可以使你对列表操作。

正则表达式

  Tcl 提供了两个用于正则表达式的命令 regexp 和 regsub。 这里的正则表导师实际上是扩展的正则表达式,与 egrep 相一致。

  支持 ^ $ . + ? > < () | []

命令结果

  每一条命令有俩个结果:一个退出值和一个字符串。退出值标志着命令是否正确执行,字符串给出附加信息。有效的返回制定议在`tcl.h", 如下:

TCL_OK

  命令正确执行,字符串给出了命令的返回值。

TCL_ERROR

  表示有一个错误发生,字符串给出了错误的描述。全局变量 errorInfo 包含了人类可读的错误描述,全局变量errorCode 机器使用的错误信息。

TCL_RETURN

  表示 return 命令被调用,当前的命令(通常是一个函数)必须立刻返回,字符串包含了返回值。

TCL_BREAK

  表示break已经被调用,最近的巡环必须立刻返回并跳出。字符串应该是空的。

TCL_CONTINUE

  表示continue已经被调用,最近的巡环必须立刻返回不跳出。字符串应该是空的。

  Tcl编程者一般需要关心退出值。当Tcl解释器发现错误发生后会立刻停止执行。

Procedures 函数

  Tcl 允许你通过proc命令来扩充命令(定义新的命令),定义之后可以向其它的内建命令一样使用。

  例如:


proc pf {str} {
puts $str
}
pf "hello world"
这里有一个初学者不注意的地方,上述的定义一定要写成那样子。而不能向下面那样写:
proc pf {str}
{
puts $str
}



  因为proc实际上也只不过是一条命令,是一换行符或分号来结束的,用集群参数来传递函数体。proc的定义如下:


proc name args tclcommand
Variables: scalars and arrays



  变量:标量和向量(即数组)

  向量就是数组,而标量是没有下表的变量。

  我们用C来类比:


int i; // i 是标量
int j[10]; // j 是向量



  变量不需要定义,使用的时候会自动的被创建。Tcl支持两种

  变量:标量和向量

  举个例子来说明吧,


set i 100
set j(0) 10
set k(1,3) 20



  i是标量,j是向量。

  引用的时候:


$i
$j(0)
$k(1,3)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入4汤圆

发表于 2011-2-21 16:05:07 | 显示全部楼层
tcl/tk 很好用

出0入0汤圆

发表于 2011-10-10 16:27:03 | 显示全部楼层
mark

出0入42汤圆

发表于 2011-10-10 16:42:24 | 显示全部楼层
puts {不搞自動化測試,tcl不學也罷}

出0入0汤圆

发表于 2011-10-12 15:21:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-13 13:01:33 | 显示全部楼层
不能理解

出0入0汤圆

发表于 2011-10-13 13:57:59 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2011-10-18 22:26:06 | 显示全部楼层
只在定义FPGA管脚的时候用,很好用

出0入0汤圆

发表于 2011-10-18 22:29:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-19 11:01:32 | 显示全部楼层
学习下。。。

出0入0汤圆

发表于 2011-10-24 00:07:29 | 显示全部楼层
不错 很详细 多谢了

出0入0汤圆

发表于 2012-1-11 00:09:29 | 显示全部楼层
mark!

出0入0汤圆

发表于 2012-1-11 08:33:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-11 20:47:18 | 显示全部楼层
学习了

出0入0汤圆

发表于 2012-11-25 19:09:51 | 显示全部楼层
mark!

学习了~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 07:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表