TCL中的一切真的是一串吗?

TCL中的一切真的是一串吗?,tcl,xilinx,vivado,Tcl,Xilinx,Vivado,如果不是,那是什么 我读到的关于TCL的所有内容都表明,TCL中的所有内容都只是一个字符串。解释器内部可以有一些其他类型和结构(为了提高性能),但在TCL语言级别,一切都必须像字符串一样运行。还是我错了 我正在使用一个名为Vivado的用于FPGA编程的IDE。TCL自动化在那里得到了积极的应用。(TCL版本仍然是8.5,如果有帮助的话) Vivado的TCL脚本依赖于某种“面向对象”系统。Web搜索不会在其他地方显示此系统的任何痕迹。 在这个系统中,对象通常通过“get_*”命令从内部数据库获

如果不是,那是什么

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

我正在使用一个名为Vivado的用于FPGA编程的IDE。TCL自动化在那里得到了积极的应用。(TCL版本仍然是8.5,如果有帮助的话) Vivado的TCL脚本依赖于某种“面向对象”系统。Web搜索不会在其他地方显示此系统的任何痕迹。 在这个系统中,对象通常通过“get_*”命令从内部数据库获取。我可以使用诸如
get\u property
set\u property
report\u 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
<...>
所以,我的问题是:这个“有效的第一类Tcl对象”到底是什么?

澄清: 这个问题看起来像是在寻求Vivado脚本的帮助,但事实并非如此。(我甚至对在标签中添加[vivado]表示怀疑。) 我可以用这些神秘的东西生活和写剧本。 但更好地理解他们的内在运作方式(对我来说,也许对其他人来说)是非常有用的。 这个“对象系统”是肮脏的黑客吗?或者它是一种完全有效的TCL用法? 如果它是有效的,我在哪里可以读到它? 如果它是一个黑客,它是如何实现的?字符串在哪里结束,对象从哪里开始

相关的:
的一部分可以被认为是支持“hack”版本的观点,但在我的问题中它是相当肤浅的。

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

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


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

要继续Donal的回答:
get_bd_cells
将单元格路径作为其参数,并将单元格句柄作为命名对象返回。此句柄对象的名称是一个Tcl值,其字符串表示形式与单元格路径匹配(
/vcu_0
)。但是这个名称(Tcl值)不是cell对象,它存储在内部。因此,在不使用
get_bd_cells
请求句柄的情况下,Tcl值
/vcu_0
只表示这个文本字符串,没有名称绑定到cell对象。旁注:过程的纯值等价物是lambda术语。查看文档了解其工作原理;他们目前需要
应用
命令才能使用。感谢您的严格详细回答!为了验证我的理解是否正确:如果
string equal$vcu{/vcu_0}
给出
1
,但是
*\u属性
命令在
$vcu
{/vcu_0}
上的行为不同,则这些命令的实现并不完全正确(无论出于何种原因:bug、性能追逐还是其他)?因为这与“如果它们有相同的字符串,那么在另一种解释中它们是相同的”相矛盾,因此这是一个抽象的漏洞。至于你的“旁注”,我真的无法理解。我大体上理解lambdas以及
应用的功能,但不知道它在这里有什么帮助,以及那些“他们”是谁Tcl中的所有内容都是一个对象,默认情况下它包含一个字符串,但该对象可以有一个内部表示,它基本上只是一个指向已知“类型”的特定内存分配的指针。您可以将其视为一个字符串以保持简单,内部有一个特定的对象表示(指针)和一个字符串表示。
> 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.