Function 将动态参数传递给foreach命令

Function 将动态参数传递给foreach命令,function,arguments,tcl,Function,Arguments,Tcl,我想动态地将参数(var list)传递给foreach命令。 我试过这个: % set names {Alice Bob Charlie} Alice Bob Charlie % foreach name $names {puts $name} Alice Bob Charlie % set foreachArg {name $names} name $names % foreach $foreachArg {puts $name} wrong # args: should be "forea

我想动态地将参数(var list)传递给
foreach
命令。 我试过这个:

% set names {Alice Bob Charlie}
Alice Bob Charlie
% foreach name $names {puts $name}
Alice
Bob
Charlie
% set foreachArg {name $names}
name $names
% foreach $foreachArg {puts $name}
wrong # args: should be "foreach varList list ?varList list ...? command"
% foreach {*}$foreachArg {puts $name}
$names
% foreach {*}[set foreachArg] {puts $name}
$names
% foreach {*}[list [set foreachArg]] {puts $name}
wrong # args: should be "foreach varList list ?varList list ...? command"

这里我想将
name$names
部分作为动态参数传递。如何执行此操作?

我认为问题的根源在于您使用的是文本字符串
$names
,而不是
$foreachArg
变量中的变量
$names
。如果您这样做,可能会更容易:

set foreachArg "name $names"
但这将导致
$foreachArg
包含简单的列表
名称Alice-Bob-Charlie

所以这会更好:

set foreachArg "name [list $names]"
foreach {*}$foreachArg {puts $name}

如果仍要使用大括号,则可能需要先使用大括号通过变量
$foreachArg
来“转换”文本
$foreachArg
,但仍然需要将列表更深一层:

set foreachArg {name [list $names]}
foreach {*}[subst $foreachArg] {puts $name}

所以,当您的列表还不存在时(但以后可能会从文件中删除),那么有必要使用bracs方法,对吗?我会选择:
set-foreachArg[list-name$names]