见下面的代码:
proc forbid args {
set dict_name [ lindex $args 1 ]
puts "dict_name llength is: [llength $dict_name ]"
set listy [ list "\$${dict_name}" ]
lappend listy [ lindex $args 2 ]
puts $listy
}
forbid k l m n
exit
代码输出为:
dict_name llength is: 1
{$l} m
为什么不是$l m
或{$l m}
?
感谢。
答案 0 :(得分:2)
原因是您在拨打puts
时没有将列表转换为字符串。因为你没有,Tcl必须这样做。当Tcl将列表转换为字符串时,它将生成一个字符串,可以保证将其转回列表。它通过在需要某种保护的元素周围添加反斜杠和/或花括号来实现。
例如:
% puts [list a b c]
a b c
% puts [list \$a \$b \$c]
{$a} {$b} {$c}
花括号不是数据的一部分,在将列表转换为字符串时,它只是输出的一部分。您可以(通常应该)通过显式将列表转换为字符串来更改格式。
例如,这个:
puts [join $listy " "]
...将导致:
$l m