TCL 双引号和花括号的区别
用了很一段时间的Modelsim,用TCL脚本仿真,开始注意起来它,看了些资料,有一个问题始终让我很困惑,那就是花括号 的用法,今天Google了一下,觉得有一点豁然了,记录一下。为了不让自己的翻译影响大家理解,先给出原文,再翻译一下。
第一段:
THE RULE
SQUARE BRACKETS are used to define a block that's run BEFORE the rest of the command on the current line, and the result is substituted into the line.
CURLY BRACES are used to define a block that's deferred - in other words it may be run AFTER the rest of the command on the current line.
规则:
方括号是用来定义一个块,它在当前行的其余命令之前运行,并且结果替换到当前行中。
花括号是用来定义一个块,它是延期的,换句话说它会在当前行的其余命令之后运行。
第二段:
In Tcl, both Curley braces and double quotes can be used to hold a block of program or data together as a single unit / parameter ... but there are differences .
a) Curley braces can stretch over a number of lines, with new lines within the block being simply a part of the block. So they're ideal for defining blocks of code.
b) Curley braces can be nested - since there are different open and close characters, blocks within blocks are written easily and naturally, which is quite impractical with double quotes!
c) the biggest difference is that double quoted blocks are evaluated at the time they are encountered by the language parser, but curley braces are deferred until they are (perhaps) evaluated later under the control of the command of which they form a part.
在TCL中,花括号和双引号都可以用来把一块程序或数据组合起来成一个单元(参数),但是他们的用法有区别。
a) 花括号可以延续到若干行,可以在块内包含若干的新行。所以花括号很适合用来定义代码块。
b) 花括号可以嵌套。因为花括号左(open)右(close)不同的字符表示,所以块中嵌套的块可以被容易自然的书写,这时使用双引号是不实际的。
c) 最大的不同是TCL语言解释器在遇到双括号内的块时就进行估值,但是花括号是延期的,块在由它形成的不同的命令的控制下延迟估值。(翻译不太好,看原文)
看下面的例子
set sample 5
proc demo {} {global sample; return $sample}
proc omed {} "global sample; return $sample"
set sample 27
puts "Curley braces - defer substitution until block is run"
puts [demo]
puts "Double quotes - just grouping; substition at definition time"
puts [omed]
puts [info body demo]
puts [info body omed]
很多资料里说到花括号就是它阻止替换,但是在定义的过程中,如果不替换那么块中的命令根本无法执行。这就很矛盾。
其实,花括号也会替换,只是延迟了,不是很多地方说的不替换,也没有什么例外。只是这个延迟我们得好好体会一下。
顺便说一下,在有些资料里说TCL中的流程控制语句是说TCL对花括号的要求很严格之类的说法,其实TCL的“保留字”都是命令,命令和参数之间肯定得有空格,而且要换行又要保持命令的格式就得用花括号了,所以对于for之类的命令换行前都得有个open braces。
TCL 双引号和花括号的区别的更多相关文章
- include包含头文件的语句中,双引号和尖括号的区别
include包含头文件的语句中,双引号和尖括号的区别 #include <>格式:引用标准库头文件,编译器从标准库目录开始搜索 #incluce ""格式:引用非 ...
- 双引号与尖括号的区别 and 相对路径与绝对路径
包含头文件的时候,如果包含的是自己写的头文件是用" " .如果是包含系统的头文件,一般用<>. 相对路径与绝对路径
- include包含头文件的语句中,双引号和尖括号的区别是什么?
include包含头文件的语句中,双引号和尖括号的区别是什么? #include <> 格式:引用标准库头文件,编译器从标准库目录开始搜索 尖括号表示只在系统默认目录或者括号内的路径查找 ...
- PHP数组键值使用单引号和双引号和无符号的区别
PHP数组键值使用单引号和双引号和无符号的区别 方法/步骤 1 第一种:$array['key']此单引号键值模式可以直接被解析为一个数组即$array 第二种:$array["key&qu ...
- C语言包含头文件时用引号和尖括号的区别
用尖括号 #include <>: 一般用于包含标准的库头文件,编译器会去系统配置的库环境变量和者用户配置的路径去搜索,而不会在项目的当前目录去查找 用双引号 #include &q ...
- shell if条件判断中:双中括号与单中括号的区别
电脑重装了系统,登录虚拟机的shell脚本需重写,在为编写的脚本命名时发现存在同名脚本,才想起来是连接公司服务器的登录脚本,不想写俩脚本,怕记混了,那就整合一下.代码如下: #!/bin/bash#z ...
- PHP中双引号和单引号的区别
在PHP中,字符串数值有单引号和双引号两种. 区别: 单引号:系统不做复杂的转义.只转义\'和\\两种转义,其他的按原样输出. 双引号:则转义比较多,\",\\,\r,\t,\n,\$等. ...
- Python中小中花括号的区别
Python主要有三种数据类型:字典.列表.元组.其分别由花括号.中括号.小括号表示. 如: 字典:dic={'a':12, 'b':34} 列表:list=[1,2,3,4] 元组:tup=(1,2 ...
- php中的双引号和单引号的区别?
1.单引号里面的字符串直接全部转义,原样输出(即:单引号内部的变量不会被执行) 2.双引号里面的变量会被替换(即:变量会执行) 例如:$name = 'hello';echo "the $n ...
随机推荐
- BZOJ_3039_玉蟾宫_(动态规划+悬线法)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3039 n*m的矩阵由R和F组成,求全是F的子矩阵的大小的三倍. 分析 悬线法: 浅谈用极大化思 ...
- apache开源项目--CouchDB
Apache CouchDB 是一个面向文档的数据库管理系统.它提供以 JSON 作为数据格式的 REST 接口来对其进行操作,并可以通过视图来操纵文档的组织和呈现. CouchDB 是 Apache ...
- lightoj 1003
有向图拓扑排序,判段是否存在. #include<map> #include<cstdio> #include<string> #include<cstrin ...
- 分割函数和根据Id串返回名字
需求:函数传入一个字符串参数 例如 123-456 将这个字符串123-456拆成两个值 123 456,在通过两个值分别查出数据(例如 张三 李四),拼接成 张三-李四 --声明变量 ...
- yarn队列提交spark任务权限控制
转载请注明出处:http://www.cnblogs.com/xiaodf/ 1 CapacityScheduler 1.1 模型介绍 1.2 资源分配相关参数 1.3 限制应用程序数目相关参数 1. ...
- Mealy和moore型状态机
Moore型状态机:下一状态只由当前状态决定,即次态=f(现状,输入),输出=f(现状): Mealy型状态机:下一状态不但与当前状态有关,还与当前输入值有关,即次态=f(现状,输入),输出=f(现状 ...
- Mesos编译步骤及部署注意事项(Ubuntu)
注意事项: 编译过程如果有错误提示少什么库,则相应的安装库即可在编译中出现 g++: internal compiler error: Killed (program cc1plus)的错误是因为内存 ...
- Hadoop datanode无法启动的错误
在启动Hadoop分布式部署的过程中,发现datanode没有正常启动,查看了一下日志发现报错: java.io.IOException: Incompatible clusterIDs in /op ...
- C++类型引用浅析
C++类型引用浅析 引言 从最早被Bjarne Stroustrup 发明,作为C语言的扩展,到广为人知C++98标准,再到最新的C++11.C++14和C++17标准,C++一直在不断地进步.演化. ...
- 简单实例一步一步帮你搞清楚MVC3中的路由以及区域
我们都知道MVC 3 程序的所有请求都是先经过路由解析然后分配到特定的Controller 以及 Action 中的,为什么这些知识讲完了Controller Action Model 后再讲呢?这个 ...