tcl 展平列表的第 3 级,w/o 解释

tcl flattens 3rd level of list, w/o explanation

查看下面的代码:

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}}

知道为什么会这样吗?
谢谢

如果 list 命令的参数中的任何一个大于一个元素,则只有相应索引元素的 return 值将具有大括号列表形式。

% 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 中有 space,

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

既然还要考虑space,Tcl没办法,只好把大括号括起来。