Tcl的变量没有类型(除了他们是否真的变量的关联数组 - 即使用$foo(bar)语法 - FO r你使用array exists)但Tcl的值。好吧,有点。 Tcl可以在不同类型之间进行变异,因为它认为合适,并且不公开这些信息[*];你所能做的就是检查一个值是否符合特定的类型。
这种一致性检查与完成string is(在您需要的-strict选项,丑陋的历史原因):
if {[string is integer -strict $foo]} {
puts "$foo is an integer!"
}
if {[string is list $foo]} { # Only [string is] where -strict has no effect
puts "$foo is a list! (length: [llength $foo])"
if {[llength $foo]&1 == 0} {
# All dictionaries conform to lists with even length
puts "$foo is a dictionary! (entries: [dict size $foo])"
}
}
请注意,所有值符合字符串类型; Tcl的值是总是可序列化。对于JSON序列化,可以使用肮脏的黑客来产生一个“正确的”序列化(严格地说,从Tcl的角度来看,所有东西都是正确的,但这对其他语言并不完全有帮助)与Tcl 8.6。代码要做到这一点,原本张贴在Rosetta Code是:
package require Tcl 8.6
proc tcl2json val