TCL中的所有内容真的都是字符串吗?

时间:2018-11-28 05:04:46

标签: tcl xilinx vivado

那是什么,如果不是?

我所读到的有关TCL的所有内容都指出,其中的所有内容都只是一个字符串。解释器内部可以有其他一些类型和结构(出于性能考虑),但是在TCL语言级别,所有内容都必须像字符串一样。还是我错了?

我正在使用IDE进行名为Vivado的FPGA编程。在那里积极使用TCL自动化。 (如果有帮助,TCL版本仍为8.5) Vivado的TCL脚本依赖于某种“面向对象”系统。网络搜索在其他地方没有显示该系统的任何痕迹。 在此系统中,通常使用“ get_ *”命令从内部数据库获取对象。我可以使用get_propertyset_propertyreport_property等命令来操纵这些对象的属性。 但是这些对象似乎不仅仅是字符串。 我将尝试说明:

> set vcu [get_bd_cells /vcu_0]
/vcu_0
> puts "|$vcu|"
|/vcu_0|
> report_property $vcu
Property                            Type    Read-only  Value
CLASS                               string  true       bd_cell
CONFIG.AXI_DEC_BASE0                string  false      0
<...>
> report_property "$vcu"
Property                            Type    Read-only  Value
CLASS                               string  true       bd_cell
CONFIG.AXI_DEC_BASE0                string  false      0
<...>

但是:

> report_property "/vcu_0"
ERROR: [Common 17-58] '/vcu_0' is not a valid first class Tcl object.
> report_property {/vcu_0}
ERROR: [Common 17-58] '/vcu_0' is not a valid first class Tcl object.
> report_property /vcu_0
ERROR: [Common 17-58] '/vcu_0' is not a valid first class Tcl object.
> puts |$vcu|
|/vcu_0|
> report_property [string range $vcu 0 end]
ERROR: [Common 17-58] '/vcu_0' is not a valid first class Tcl object.

所以,我的问题是:“有效的一流Tcl对象”到底是什么?

说明: 这个问题似乎是在寻求Vivado脚本的帮助,不是。 (我甚至对在标签中添加[vivado]都感到怀疑。) 我可以使用这些神秘对象生活和编写脚本。 但这对于更好地了解他们的内部运作非常有用(对我,也许对其他人而言)。 这个“对象系统”是肮脏的黑客吗?还是完全正确的TCL用法? 如果有效,我在哪里可以读到? 如果是骇客,该如何实施(或将其实施)?字符串的结尾和对象从何处开始?

相关: this answer的一部分可以被视为赞成“ hack”版本的意见,但就我的问题而言,这还很肤浅。

1 个答案:

答案 0 :(得分:1)

第一类Tcl值是一个字符序列,其中这些字符是从Unicode规范的基本多语言平面中提取的。 (我们将在将来的版本中放宽对BMP的限制,但我们建议不要使用该版本。)从逻辑上来说,所有其他值都被视为该类型的子类型。例如,二进制字符串的字符来自[U + 000000,U + 0000FF]范围,而整数是ASCII数字序列,可能带有少量前缀(例如,-为负数)。

就实现而言,还有更多的事情要做。例如,整数通常使用系统在值装箱机制中使用的字节序(但可以在需要时扩展为bignums)使用64位二进制值来实现,并且该值的字符串版本根据需要生成并在缓存时缓存整数值不变。浮点数是IEEE双精度浮点数。列表在内部实现为值的数组(具有智能的分配处理能力)。字典是散列表,散列表悬挂在每个散列桶中。等等。 这些都是实施细节!作为程序员,您可以并且应该通常完全忽略它们。您需要知道的是,如果两个值相同,则它们将具有相同的字符串,如果它们具有相同的字符串,则在另一种解释中它们将相同。 (由于其他原因,具有不同字符串的值也可以相等:例如,0xFF在数值上等于255(十六进制与十进制),但是它们不等于字符串。Tcl的真正自然相等是字符串相等。 )

真正的可变实体通常表示为命名对象:只有名称是Tcl值。这就是Tcl的过程,类,I / O系统等全部工作的方式。您可以对它们调用操作,但只能在有限的范围内看到它们。