如何在eval命令中维护参数类型

时间:2014-12-18 06:11:36

标签: tcl

我们说我有这个:

set arg {{e1 e2}}
eval puts $arg

因为eval命令首先连接其参数,所以$ arg变为{e1 e2}。

如何在调用eval时保持参数不变?在上面的例子中,我想$ arg仍然是{{e1 e2}}。

具体来说,我的情况是这样的:

proc p1 {cmd arg} {
  eval $cmd $arg
}

因此命令名及其参数都传递给此proc。命令名称始终是文字值,因此不是问题。关键是我希望在调用eval时参数' e数据完整性不变。

2 个答案:

答案 0 :(得分:1)

% set arg {{e1 e2}}
{e1 e2}
% eval { puts $arg }
{e1 e2}
% # Or use 'list' command to make them not to be get expanded.
% eval [ list puts $arg ] 
{e1 e2}
% 

根据你的proc应用这个逻辑,它可以是以下任何内容

% proc p1 { cmd arg } {
    eval { $cmd $arg } 
}
% p1 puts {{e1 e2}}
{e1 e2}
%     
% proc p2 { cmd arg } { 
    eval [ list $cmd $arg ] 
}
% p2 puts {{e1 e2}}
{e1 e2}
% proc p3 { cmd arg } { 
    eval $cmd [ list $arg ] 
}
% p3 puts {{e1 e2}}
{e1 e2}
%

答案 1 :(得分:0)

尝试分别用双引号指定命令名及其参数。

Tcl会将它们视为两个独立的字符串。