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
没办法,只好把大括号括起来。
查看下面的代码:
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
没办法,只好把大括号括起来。