【发布时间】:2018-11-28 05:04:45
【问题描述】:
如果不是,那是什么?
我读到的关于 TCL 的所有内容都表明所有内容都只是其中的一个字符串。解释器内部可能有一些其他类型和结构(出于性能考虑),但在 TCL 语言级别上,一切都必须像字符串一样表现。还是我错了?
我正在使用一个名为 Vivado 的 IDE 进行 FPGA 编程。 TCL 自动化在那里被积极使用。 (TCL版本还是8.5,如果有帮助的话)
Vivado 的 TCL 脚本依赖于某种“面向对象”系统。网络搜索在其他地方没有显示该系统的任何痕迹。
在这个系统中,对象通常是使用“get_*”命令从内部数据库中获取的。我可以使用get_property、set_property、report_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 用法? 如果它是有效的,我在哪里可以阅读它? 如果它是一个 hack,它是如何(或可以)实现的?字符串结束和对象到底从哪里开始?
相关: this answer 的一部分可以被认为是支持“hack”版本的意见,但在我的问题的意义上它是相当肤浅的。
【问题讨论】:
-
Tcl 中的所有内容都是一个对象,默认情况下包含一个字符串,但该对象可以有一个内部表示,它基本上只是一个指向已知“类型”的特定内存分配的指针。你可以把它想象成一个字符串来保持简单,内部有一个特定的对象表示(一个指针)和一个字符串表示。