TCL subst或eval命令在我的情况下不起作用。。

TCL subst或eval命令在我的情况下不起作用。。,tcl,Tcl,我想知道为什么上述案例对我不起作用。。subst命令应执行变量和命令替换。但是为什么我的变量不替换呢 有人能解释一下发生了什么吗?你把方括号放错地方了(在eval案例中你甚至不需要它们)。按照您编写命令的方式,sum{$a}{$b}]在subst或eval命令可以计算$a和$b的内容之前进行计算 正确答案是: subst or eval command is not working in my case .. % proc sum {a b} { return [expr $a+$b

我想知道为什么上述案例对我不起作用。。subst命令应执行变量和命令替换。但是为什么我的变量不替换呢


有人能解释一下发生了什么吗?

你把方括号放错地方了(在
eval
案例中你甚至不需要它们)。按照您编写命令的方式,
sum{$a}{$b}]
subst
eval
命令可以计算
$a
$b
的内容之前进行计算

正确答案是:

subst or eval command is not working in my case .. 

% proc sum {a b} {
    return [expr $a+$b]
}
%
% set a 1
1
% set b 2
2
% sum $a $b
3

%
% sum {$a} {$b}
can't use non-numeric string as operand of "+"

%
% subst [sum {$a} {$b}]
can't use non-numeric string as operand of "+"   >>>>>>>>> Why i am unable to substitue the value
%

% eval [sum {$a} {$b}]
can't use non-numeric string as operand of "+"    >>>>>>>>> Why i am unable to substitue the value
%


您将方括号
[]
放错了位置(在
eval
案例中甚至不需要它们)。按照您编写命令的方式,
sum{$a}{$b}]
subst
eval
命令可以计算
$a
$b
的内容之前进行计算

正确答案是:

subst or eval command is not working in my case .. 

% proc sum {a b} {
    return [expr $a+$b]
}
%
% set a 1
1
% set b 2
2
% sum $a $b
3

%
% sum {$a} {$b}
can't use non-numeric string as operand of "+"

%
% subst [sum {$a} {$b}]
can't use non-numeric string as operand of "+"   >>>>>>>>> Why i am unable to substitue the value
%

% eval [sum {$a} {$b}]
can't use non-numeric string as operand of "+"    >>>>>>>>> Why i am unable to substitue the value
%


首先,您确实理解为什么“
$a
”不是一个可以添加的值?它根本不是一个数字。(我不是说
$a
,从变量中读取并替换它的指令,我是指由一个
$
后跟一个
a
组成的字符串)

当您在Tcl中用大括号括起来时,它的意思是“不要对这个字符串做任何事情,按原样使用它”。始终(有时您将该字符串输入到一个进行计算的命令中,但不总是)当你用方括号括起来时,它意味着立即将字符串作为脚本进行计算,并使用脚本的结果作为替换值。始终

当您这样做时:

sum [subst {$a}] [subst {$b}]
您需要了解对
sum
的调用是在将参数集合到
subst
时完成的。该调用会产生错误,因此对
subst
的调用永远不会发生。与您使用的
eval
表单类似

如果我们使用一种不那么令人惊讶的形式:

subst [sum {$a} {$b}]
然后您会发现:
sum{1}{2}
subst
无法将整个字符串理解为脚本。另一方面,使用:

subst {sum {$a} {$b}}
在这种情况下,您得到的错误并非来自
eval
,而是来自对
sum
inside的调用仍然是错误的

我想你可以做到:

eval {sum {$a} {$b}}

但事实并非如此。必须有一种更简单、更不容易出错的方法。

首先,您确实理解为什么“
$a
”不是一个可以添加的值?它根本不是一个数字。(我不是指
$a
,从变量中读取并替换它的指令,我是指由
$
后跟
a
组成的字符串)

当您在Tcl中用大括号括起来时,它的意思是“不要对这个字符串做任何事情,按原样使用它”。始终(有时您将该字符串输入到一个进行计算的命令中,但不总是)当你用方括号括起来时,它意味着立即将字符串作为脚本进行计算,并使用脚本的结果作为替换值。始终

当您这样做时:

sum [subst {$a}] [subst {$b}]
您需要了解对
sum
的调用是在将参数集合到
subst
时完成的。该调用会产生错误,因此对
subst
的调用永远不会发生。与您使用的
eval
表单类似

如果我们使用一种不那么令人惊讶的形式:

subst [sum {$a} {$b}]
然后您会发现:
sum{1}{2}
subst
无法将整个字符串理解为脚本。另一方面,使用:

subst {sum {$a} {$b}}
在这种情况下,您得到的错误并非来自
eval
,而是来自对
sum
inside的调用仍然是错误的

我想你可以做到:

eval {sum {$a} {$b}}

但确实不需要。必须有一种更简单、更不容易出错的方法。

您不能正确理解Tcl

subst
获取一个字符串并替换其中的所有变量,对吧。
但是您将
sum{$a}{$b}
的结果传递给它,结果失败

因此,在调用
sum
之前,您可以选择
subst
每个参数:

eval [subst {sum {$a} {$b}}]
或修改总和,以便为您进行评估:

sum [subst {$a} {$b}]
expr
执行自己的一轮计算,这就是为什么您通常向它传递一个普通字符串(用
{}
括起来),但在本例中,我们实际上使用了这个事实。
uplevel
在调用方的上下文中执行命令

如果您调用命令,Tcl将在实际调用之前替换变量,因此此代码段可能有助于您更好地理解Tcl:

proc sum {a b} {
    uplevel 1 [list expr $a + $b]
}

您没有正确理解Tcl

subst
获取一个字符串并替换其中的所有变量,对吧。
但是您将
sum{$a}{$b}
的结果传递给它,结果失败

因此,在调用
sum
之前,您可以选择
subst
每个参数:

eval [subst {sum {$a} {$b}}]
或修改总和,以便为您进行评估:

sum [subst {$a} {$b}]
expr
执行自己的一轮计算,这就是为什么您通常向它传递一个普通字符串(用
{}
括起来),但在本例中,我们实际上使用了这个事实。
uplevel
在调用方的上下文中执行命令

如果您调用命令,Tcl将在实际调用之前替换变量,因此此代码段可能有助于您更好地理解Tcl:

proc sum {a b} {
    uplevel 1 [list expr $a + $b]
}

sum[subst{$a}][subst{$b}]
是正确的方法。或者你可以做
sum{$:a}{$:b}
一些惊喜,试试
set c1;set d2;sum{$c}{$d}
。它会报告这个变量不存在。
sum[subst{$a}][subst{$b}
是正确的方法。或者你可以做
sum}:b}
要想获得一些惊喜,请尝试
设置C1;设置D2;求和{$c}{$d}
。它将报告此变量不存在。