如何知道Tcl中变量的数据类型?

如何知道Tcl中变量的数据类型?,tcl,rtti,Tcl,Rtti,我需要知道Tcl中一些变量的数据类型。例如,有三个变量: set a 10 set b { I love Tcl } set c "Hello" 假设我不知道他们的类型。但我需要知道这一点,以便进一步开展我的工作。那么,在上面的例子中,我将如何确定这一点呢- a是一个整数 b是一张单子 c是一个字符串 Tcl的变量根本没有数据类型。它们都可以持有任何价值 Tcl的值有类型,但类型系统在很大程度上是隐藏在脚本中的,人们通常会说一切都是字符串,因为字符串是Tcl中所有其他值类型

我需要知道Tcl中一些变量的数据类型。例如,有三个变量:

set a 10
set b { I love Tcl }
set c "Hello"
假设我不知道他们的类型。但我需要知道这一点,以便进一步开展我的工作。那么,在上面的例子中,我将如何确定这一点呢-

a是一个整数 b是一张单子 c是一个字符串
Tcl的变量根本没有数据类型。它们都可以持有任何价值

Tcl的值有类型,但类型系统在很大程度上是隐藏在脚本中的,人们通常会说一切都是字符串,因为字符串是Tcl中所有其他值类型的超类型。您的代码也不应该依赖于值的类型,只要您拥有的值可以强制为正确的类型,这是由Tcl的各种操作自动完成的,例如,列表操作强制为列表类型,算术操作强制为数字类型。最近的这种强制被缓存在值中;这使得大多数操作实际上相当快

您可以使用Tcl::unsupported::representation命令查看值类型的Tcl系统的当前观点,这是一个仅调试的操作。请注意,类型可能并不总是您所期望的类型;系统对您有不同的打字概念

set a 10
set b { I love Tcl }
set c "Hello"

# Print the representations; these are all of LITERALS
puts [tcl::unsupported::representation $a]
puts [tcl::unsupported::representation $b]
puts [tcl::unsupported::representation $c]

# Now actually use the values in ways that do type forcing...
set a [expr {$a << 0}]
set b [lrange $b 0 end]
set c [string range [append c \u1234] 0 end-1]

# Print the representations again
puts [tcl::unsupported::representation $a]
puts [tcl::unsupported::representation $b]
puts [tcl::unsupported::representation $c]
我的机器的输出示例:

value is a pure string with a refcount of 4, object pointer at 0x7fad2df273d0, string representation "10" value is a pure string with a refcount of 4, object pointer at 0x7fad2df26e30, string representation " I love Tcl " value is a pure string with a refcount of 4, object pointer at 0x7fad2df29860, string representation "Hello" value is a int with a refcount of 2, object pointer at 0x7fad2df2a3a0, internal representation 0xa:0x7fad2df29a40, no string representation value is a list with a refcount of 2, object pointer at 0x7fad2df27790, internal representation 0x7fad30826510:0x0, no string representation value is a string with a refcount of 2, object pointer at 0x7fad2df29440, internal representation 0x7fad30826210:0x0, no string representation 最后一行特别奇怪,但这是因为我们已经从UTF-8转换为大约UTF-16

同样,不要使代码依赖于类型。tcl::unsupported命名空间中命令的行为和格式可能会更改,恕不另行通知。值的表示可能会发生更改,恕不另行通知,并且不属于Tcl API的一部分。如果您正在编写C代码来处理表示,则可以将其编写为:

这是我已知的代表吗? 如果没有,我可以将字符串形式转换为我支持的表示形式吗?
我只需要知道变量的类型,而不需要执行任何函数。原型/实验性本机代码生成器确切地知道类型是如何工作的,并做了一些聪明的事情,包括选择性循环展开和主要内联,以使内容更有效地工作。此外,还可以编写llength$a,强制a进入列表表示。您确实不能依赖具有特定类型的Tcl值。