TCL语法

2023-11-13

tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以
解释运行,其强大的功能和简单精妙的语法会使你感到由衷的喜悦
,这片文章对 tcl有很好的描述和说明。极具可读性,我并不是原
封不动的翻译而是加上了一些自己的体会和例子,如有错误请指正。
如果你看起来很吃力,那是因为 tcl与一般的语言有一些不同之处,
刚开始可能有一些不理解,但很快就会掌握的。请坚持一下,我能坚
持写完,你至少也应该坚持读一遍吧!

tcl overview

这篇文章里包含了几乎 tcl 的全部。文章的作者是tcl的缔造
者john ousterhout,对tcl的诠释非常清楚。

introduction 简介

tcl 代表 "tool command language" 发音为 "tickle." 。它
实际上包含了两个部分:一个语言和一个库。

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

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

应用程序使用tcl作为它的命令语言有三个好处:
1 tcl提供了标准语法,一旦用户掌握了tcl就可以很容易的发
布命令给基于tcl的程序。
2 tcl实现了很多的功能,使你的工作变得很方便。
3 tcl可作为程序间通信的接口。

tcl interpreters 解释器

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

tcl data types 数据类型

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、20 作为参数来传给
它,a使它要操作的
变量名,22是要付给的a值。

tcl的命令名可以使内建的命令也可以是用户建的新命令,在
应用程序中用函数tcl_createcommand来创建。所有的参数作为字
符串来传递,命令自己会按其所需来解释的参数的。命令的名字必
须被打全,但 tcl解释器找不到一同名的命令时会用 unknown命令
来代替。
在很多场合下,unknown 会在库目录中搜寻,找到一个的话,
会自动生成一个tcl命令并调用它。unknown经常完成缩略的命令名
的执行。但最好不要使用。

comments 注释

和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语言中的一样。

/b backspace (0x8).

/f form feed (0xc).

/n newline (0xa).

/r carriage-return (0xd).

/t 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 22/nset b 33'


command summary 命令综述

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

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

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

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

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

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

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

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

expressions 表达式

对字符串的一种解释是表达式。几个命令将其参数按表达式处
理,如: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

set a 1
expr $a+2

expr 1+2
都返回 3

lists 列表

字符串的另一种解释为列表。一个列表是类似于结果的一个字
符串包含了用空白分开的很多域。例如 "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 可以使你对列
表操作。

regular expressions 正则表达式

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

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

command results 命令结果

每一条命令有俩个结果:一个退出值和一个字符串。退出值标
志着命令是否正确执行,字符串给出附加信息。
有效的返回制定议在`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)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCL语法 的相关文章

  • jQuery 修剪不会删除?

    如何修剪字符串中的所有空格 即使它们是由不间断空格引起的 nbsp 例如 var foo trim p nbsp foo nbsp p text foo 的值为 foo 代替 foo UPDATE所以 问题不在于 jQuery 的修剪功能
  • 命令 test -x 在 ubuntu 中做什么?

    什么是test x从 etc cron daily logrotate 做什么 test x usr sbin logrotate exit 0 usr sbin logrotate etc logrotate conf 它是否测试是否已经
  • 定义一个调用另一个 emacs 命令的 emacs 命令(保留交互式内容)

    如何定义一个 emacs 命令 X 执行某些操作 然后调用另一个 emacs 命令 Y 并复制命令 Y 的交互界面 我想定义查询替换的替代版本 并临时切换大小写折叠搜索的值 defun alt query replace a b c d e
  • 日期格式到cron格式转换

    我想将日期格式更改为 cron 日期格式 怎么办 日期格式 2018 05 15 17 30 00 cron 格式 30 17 15 05 您可以通过多种方式做到这一点 但这是更简单的方法之一 bin bash DATESTR 2018 0
  • 调试 tcl 流程 - 就像 bash -

    我只是想知道是否有类似的东西set x因为它存在于 Bash forTCL 中 它允许我跟踪脚本流程 然后帮助我调试它 Simple trace add execution source enterstep apply cmd op put
  • Adb安装进度条

    我是这方面的初学者 所以如果我问任何明显的问题 请介意我 我正在尝试安装一个apk到我的设备使用adb install apk apk但是 那apk大约有几百 MB 大 并且需要一些时间 我可以在命令窗口中实现某种进度条来显示进度吗 我见过
  • 在 C 程序中使用 tcl 和 tk 存根

    我需要一个简单的 C 程序来创建 tcl 解释器 初始化 tcl 和 tk 然后加载给定的 tcl tk 脚本 我想使用 tcl 和 tk 存根 以确保程序将在具有不同版本的 tcl tk 的计算机上运行 我将使用这个程序而不是运行wish
  • Tcl 脚本中错误的静态检测

    我已经开发了一些代码 并且在 Linux 机器上遇到了 Tcl 解释器错误标记的问题 usr bin tclsh if 1 puts abc1 elseif puts abc2 上面的代码没有标记错误 elseif 条件 直到进入elsei
  • 如何在 Bash shell 脚本中检查目录是否存在?

    什么命令检查 Bash shell 脚本中的目录是否存在 检查目录是否存在 if d DIRECTORY then echo DIRECTORY does exist fi 检查目录是否不存在 if d DIRECTORY then ech
  • 如何让proc更有效?

    有一个顶点集合 x1 y1 x2 y2 xn yn 我想改变这些坐标的中心 所以我尝试 proc changeCenter vertices X Y set myList list foreach element vertices lapp
  • Tcl正则表达式

    set d aa1 1 set d aa2 1 set d aa3 1 set d aa4 1 set d aa5 1 set d aa6 1 set d aa7 1 set d aa8 1 set d aa9 1 set d aa10 1
  • 将 csv 数据写入命名空间内的矩阵时,TCL 抛出无效命令名称

    这是一个奇怪的问题 我似乎无法弄清楚 我正在使用 TCL 8 5 我正在尝试使用以下命令将数据从 CSV 文件读取到矩阵中csv read2matrix命令 然而 每次我这样做时 它都会说我试图写入的矩阵是无效命令 我正在做的事情的片段 p
  • 如何使用 Objective-C 用空格分隔字符串?

    假设我有一个像这样的字符串 hello world this may have lots of sp ace or little space 我想将此字符串与此分开 hello world this may have lots of sp
  • 奇怪的问题,除非单击鼠标,否则按钮不会重新启用

    我的应用程序是使用 WPF 中的 MVVM 模式编写的 我的所有按钮都使用命令绑定来执行模型中的代码 所有命令在 CanExecute 中都有代码来确定绑定按钮的启用状态 该逻辑工作完美 但在所有情况下 GUI 都会保持禁用状态 除非我单击
  • IN 语句中的数据上下文 ExecuteCommand 参数

    运行自定义的最佳方式是什么sql声明使用IN从 C LinQ 到 sql 数据上下文 我努力了 db ExecuteCommand UPDATE tblCard SET used 1 WHERE id IN 0 AND customer i
  • 如何从 tcl 列表中删除空元素

    你好 我有以下清单 设置 qprList 12345 12345
  • 正则表达式文字-文本范围

    有什么方法可以向正则表达式指示要显式搜索的文本块吗 我问这个问题是因为我必须匹配一段非常非常长的文本 其中包含各种元字符 并且 并且必须完全匹配 然后是一些灵活的内容 足以值得使用正则表达式 然后是更多文本必须完全匹配 冲洗 重复 不用说
  • TCL 脚本 - exec 将文本刷新到我的标准输出

    我怎样才能 冲洗 stdout of the exec命令到我的脚本stdout没有 等待 结果执行返回 例如在下面的脚本中我想要git clone输出立即出现在我的脚本上下文中 usr bin tclsh git outputs prog
  • (Tcl/Expect) 退出后清屏

    我想在退出我的 半 交互式期望脚本后清除屏幕 在本地计算机上 我可以在脚本中做到这一点吗 这是我尝试过的 但失败了 usr bin expect f set env TERM vt100 spawn ssh Y username domai
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba

随机推荐

  • ThinkPHP3.2.3学习笔记1---控制器

    ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的 最早诞生于2006年初 2007年元旦正式更名为ThinkPHP 并且遵循Apache2开源协议发布 ThinkPHP从诞生以来一直秉承简洁实用的设计原则 在保持出色的性
  • Python基本语法

    文章目录 Python 基础语法 行缩进 代码行处理 引用import 输入和输出 Python 基础语法 本文主要讲解Python的特殊的语法 行缩进 Python的代码块不是使用 而是使用缩进 正确示例 if True print An
  • 深入浅出UML类图

    在UML 2 0的13种图形中 类图是使用频率最高的UML图之一 Martin Fowler在其著作 UML Distilled A Brief Guide to the Standard Object Modeling Language
  • 数字电路设计之低功耗设计方法二:memory-partition

    Memory partition是在进行内存寻址进行读或者写数据的时候 我们寻找地址一般是全部比较一遍 但是我们可以就是先比较第一位 然后在比较接下来的位数 这样就减少了近一般的内存访问次数 大大降低了功耗 在这里 我定义了地址空间为十六
  • QT元对象

    1 QT元对象系统简介 Qt的信号槽和属性系统具有运行时查询对象信息的能力 但是C 查询对象信息的能力比较有限 仅仅能够通过RTTI的typeid和dynamic cast关键字来实现 QT拓展了C 的这种能力 但是没有采用C 标准库的RT
  • 数据库系统原理(二)--ER模型

    向关系模式转换 实体类型的转换 将每个实体类型转换成一个关系模式 实体的属性即为关系的属性 实体标识符即为关系的键 联系类型的转换 1 实体间的联系是1 1 可以在两个实体类型转换成两个关系模式中的任意一个关系模式的属性中加入另一个关系模式
  • [云原生专题-28]:K8S - Kubernetes(K8S)Master集群构建与安装过程详细解读 - Dashboard的安装与访问

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122788745 目录 第1章 Das
  • 弱网测试总结

    一 弱网测试 网络请求 代理proxy 进行目标操作 修改返回值 延迟 丢包等 返回给数据接收端 二 弱网测试的重要性 1 弱网情况下 缺少丢包 延时软件的处理机制 程序处理出问题 2 实时同步性高的场景 微信视频聊天 远程会议 同步书写等
  • SSM图书馆预约系统 毕业设计源码21417

    目 录 摘要 1 绪论 1 1研究背景与意义 1 2研究内容 1 3ssm框架介绍 1 4论文结构与章节安排 2 旅客行程智能推荐系统系统分析 2 1 可行性分析 2 1 1 技术可行性分析 2 1 2 经济可行性分析 2 1 3 法律可行
  • 基于Matlab的贝叶斯网络优化卷积神经网络结合门控循环单元(CNN-GRU)的预测

    基于Matlab的贝叶斯网络优化卷积神经网络结合门控循环单元 CNN GRU 的预测 在深度学习领域 卷积神经网络 Convolutional Neural Networks CNN 和门控循环单元 Gated Recurrent Unit
  • Kafka的相关知识

    一 Kafka基本介绍 Kafka是一个分布式 支持分区的 partition 多副本的 replica 基于zookeeper协调的分布式消息系统 具有 高吞吐量 低延迟 可扩展性 持久性 可靠性 容错性 高并发等特性 常见的应用场景有
  • 清华大学岂凡超:义原的介绍和义原的自动推荐

    义原 Sememe 在语言学中是指最小的不可再分的语义单位 而知网 HowNet 则是最著名的义原知识库 近些年来 包括知网在内的语言知识库在深度学习模型中的重要性越来越显著 然而 这些人工构建的语言知识库往往面临新词不断出现的挑战 知网也
  • web服务器日志配置文件,Net Core Web配置文件及日志输出

    一 配置文件 在之前的ASP NET WebForm或者 ASP NET MVC模式下开发Web应用 通常依赖System Configuration和XML配置文件 比如说Web config ASP NET Core配置系统针对以前的A
  • CTF php反序化简单的入门题目 (对初学者非常友好,单一考点)

    地址 要先注册的 http www whalwl site 8026 题目非常明了 只有一个类site 和一个魔法函数 destruct unserialize 反序化前自动调用 destruct 关键 在 a this gt title
  • 华为OD机试真题-最小循环子数组-2023年OD统一考试(B卷)

    题目描述 给定一个由若干整数组成的数组nums 请检查数组是否是由某个子数组重复循环拼接而成 请输出这个最小的子数组 输入描述 第一行输入数组中元素个数n 1 lt n lt 100000 第二行输入数组的数字序列nums 以空格分割 0
  • 思考long 和 double都是8个字节为什么double范围更大?

    System out println Double MAX VALUE System out println Double MIN VALUE System out println Long MAX VALUE System out pri
  • 2023最新WSL搭建深度学习平台教程(适用于Docker-gpu、tensorflow-gpu、pytorch-gpu)

    导语 2023 4 11 对于机器学习er配置环境一直是个头疼的事 尤其是在windows系统中 尤其像博主这样的懒人 又不喜欢创建虚拟环境 过段时间又忘了环境和包的人 经常会让自己电脑里装了各种深度学习环境和python包 长时间会导致自
  • c语言中c的文件操作,C语言中的文件操作方法

    int open char pathname int access int permiss 为读或写打开一个文件 按后按access来确定是读文件还是写文件 access值见下表 access值 意义 O RDONLY 读文件 O WRON
  • Mybatis与Spring集成配置

    目录 具体操作 1 1 添加依赖 1 2创建spring的配置文件 1 3 注解式开发 Aop整合pagehelper插件 1 创建一个AOP切面 2 Around execution xxx xxx 表达式解析 前言 上篇我们讲解了关于M
  • TCL语法

    tcl是一种很通用的脚本语言 它几乎在所有的平台上都可以解释运行 其强大的功能和简单精妙的语法会使你感到由衷的喜悦 这片文章对 tcl有很好的描述和说明 极具可读性 我并不是原封不动的翻译而是加上了一些自己的体会和例子 如有错误请指正 如果