TCL 中的一切真的都是字符串吗?

Is everything really a string in TCL?

如果不是,它是什么?

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

我正在使用名为 Vivado 的 IDE 进行 FPGA 编程。那里积极使用 TCL 自动化。 (TCL版本还是8.5,有帮助的话) Vivado 的 TCL 脚本依赖于某种 ​​"object oriented" 系统。网络搜索在其他地方没有显示该系统的任何痕迹。 在此系统中,对象通常使用 "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.

所以,我的问题是:这 "valid first class Tcl object" 到底是什么?

澄清: 这个问题看起来像是在寻求有关 Vivado 脚本的帮助,但它不是。 (我什至怀疑是否要将 [vivado] 添加到标签中。) 我可以用这些神秘的物体生活和编写脚本。 但是(对我,也许对其他人)更好地了解他们的内部运作是非常有用的。 这是 "object system" 肮脏的黑客攻击吗?还是完全有效的 TCL 用法? 如果它有效,我可以在哪里阅读它? 如果它是黑客攻击,它是如何(或可以)实施的?字符串结束和对象开始的确切位置?

相关: 的一部分可以被认为是支持 "hack" 版本的意见,但就我的问题而言,它是相当肤浅的。

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

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

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

Vivado TCL 不是 TCL。 Vivado 不会真正记录他们称为 TCL 的语言,而是让您参考真正的 TCL 语言文档。在 Vivado TCL 和 TCL 不同的地方,您只能靠自己,没有帮助。考虑到非常大的数据库,TCL 对于脚本语言来说是一个糟糕的选择,因此他们不得不将其混为一谈以使其发挥一半的功能。您最好在 Xilinx 论坛上获得帮助,然后在一般 TCL 论坛上获得帮助。为什么他们选择 TCL 而不是 python 是任何人都无法理解的。