专栏首页Lauren的FPGA深入理解Tcl中的置换

深入理解Tcl中的置换

Tcl语言中有三类置换:变量置换(点击这里复习:变量置换)、命令置换(点击这里复习:命令置换)和反斜杠置换(点击这里复习:反斜杠置换)。可以说“置换”是Tcl的灵魂,同时也是让初学者容易感到困惑的一个难点。很多初学者常会碰到这样的情形:不希望发生置换时却发生了或者希望发生置换时却没有发生,加之一些Tcl解释器调试功能欠佳,往往让初学者受挫,觉得自己的脚本发生了诡异的行为。实际上,Tcl的置换机制很简单,其行为也很容易预测,只需记住如下两条规则:

规则1:Tcl在解析一条命令时,只从左向右解析一次,进行一轮置换,每一个字符只会被扫描一次;

规则2:每一个字符只会发生一层置换,而不会对置换后的结果再进行一次扫描置换

看一个典型的例子,在这个例子中,变量x被赋值为10,变量a被赋值为字符x。之后,给变量b赋值$$a。根据上述规则,Tcl从左向右对命令”set b $$a”进行解析,扫描所有的字符,发现$$a时,执行变量置换,得到$x,同时只发生一层置换,不会对置换后的结果$x再进行扫描置换(否则$$a中最左侧也就是第一个$将被扫描两次,与规则1冲突,)。因此,最左侧的$并不会触发变量置换,最终变量b的值将会是$x,而不是10。

根据上述两个规则,理解如下脚本的执行结果。

从Tcl代码风格的角度看,应尽可能地将置换简单化,这意味着尽可能地将多层次嵌套的置换分解为更简单的层次置换,这可通过命令分解实现。同时避免在同一条命令中出现太多的置换,尤其避免出现太多复杂的不同类型的置换,这对代码维护十分不利。此外,值得考虑的方法是建立“过程”,将复杂的操作隔离开来,从而增强代码的可读性和可维护性。看这样一个例子,计算两个字符串的总长度,这里用到了三个命令:set、expr和stringlength。在计算str_len时,使用了变量置换和命令置换,同时出现了命令嵌套。

对比另一种写法,将嵌套拆分,代码的可读性便跃然纸上。

结论:

Tcl在解析一条命令时

-每个字符只会被扫描一次

-每个字符只会发生一层置换

本文分享自微信公众号 - Lauren的FPGA(Lauren_FPGA),作者:Lauren Gao

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何理解HLS中的Stream

    数据缓存采用LUT时,实际上用的是SLICEM里的LUT。如果使用量大,就会出现这些LUT分布在不同列,同时,也增加了CLB的端口密度(Pin Density)...

    Lauren的FPGA
  • 学习笔记:深度学习与INT8

    越来越精确的深度学习模型面临两大挑战:计算密度越来越高;存储带宽越来越大。解决此问题的可行方法之一就是降低数据位宽。这是因为较低的数据位宽可以有效降低计算密度,...

    Lauren的FPGA
  • Tcl系列文章:修改列表(1)

    很多情况下需要对原有列表进行修改,这种修改通常包括:获取指定范围内的元素形成子列表;插入新的元素形成新列表;删除列表中的元素;替换列表中的元素;修改指定索引的列...

    Lauren的FPGA
  • Confluence 6 警告的类型 原

    一些诊断警告在默认情况下是禁用的,这是因为这些警告可能会影响你系统的性能,或者这些警告不是持续诊断的。

    HoneyMoose
  • RCNN 学习笔记

    Author : Ross Girshick Jeff Donahue Trevor Darrell Jitendra Malik

    Natalia_ljq
  • 通过SvcUtil.exe生成客户端代码和配置

    WCF服务调用通过两种常用的方式:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式,一种是通过ChannelFactory直接创建服务代理对象...

    跟着阿笨一起玩NET
  • 推荐批量优化pdf文件的软件

    http://www.pc6.com/softview/SoftView_14796.html

    hotqin888
  • 大数据引擎推动国家治理能力现代化

    大数据文摘
  • 基于linux的嵌入IPv4协议栈的内容过滤防火墙系统(3)-内容过滤防火墙系统简介

    也可以叫做内核编程,因为系统对数据包进行过滤的工作量非常大,使用模块编的话,可以提高系统的效率。在本程序中,包过滤模块,内容过滤模块和数据交互模块都使用的模块...

    源哥
  • LeetCode46|求根到叶子节点数字之和

    给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。

    后端Coder

扫码关注云+社区

领取腾讯云代金券