TCL lappend创建了另一个层次结构

时间:2016-05-17 13:54:51

标签: list tcl

见下面的代码:

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}? 感谢。

1 个答案:

答案 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