见下面的代码:
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}}
任何想法为什么会这样?
感谢。
答案 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
没有别的办法,只能用括号括起来。