tcl扁平化第三级列表,没有解释

时间:2016-02-29 14:12:57

标签: list nested tcl

见下面的代码:

set k [list]
foreach i [list 1 2] {
    lappend k [ list "hey" [ list "ho" [ list $i ] ] ]
}
puts [ join $k ",and,"]
exit

结果是:

hey {ho 1},and,hey {ho 2}

但我希望结果如下:

hey {ho {1}},and,hey {ho {2}}

任何想法为什么会这样?
感谢。

1 个答案:

答案 0 :(得分:1)

如果list命令的参数中的任何一个超过元素1,则只有相应的索引元素的返回值将具有支撑列表形式。

% list a b c; # All list args are having only single element
a b c
% list "a" "b" "c"; # Same as above
a b c
% list {a} {b} {c}; # Same again... 
a b c
% list "a b" c d; # Here, 1st arg is having 2 elements. 
{a b} c d
%

Tcl的wiki页面已经提到过只有一种情况下嵌套列表的奇怪行为,这是

% list [list [list x]]
x

这意味着单独使用Tcl列表不能用于表示所有类型的数据结构,因为Tcl列表在一系列嵌套列表时神奇地崩溃,其中终端列表只有一个单词这不需要逃避。

更新:

更重要的是,如果arg中有空格,

% list "x "
{x }
% list "x"
x
%

由于还必须考虑空间,Tcl没有别的办法,只能用括号括起来。