0
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
%

我想知道为什么上述情况对我不起作用.. subst 命令应该执行变量和命令替换。但是为什么我的变量没有替代。

任何人都可以请解释发生了什么吗?

4

3 回答 3

2

首先,你明白为什么“<code>$a”不是你可以添加的值吗?这根本不是一个数字。(我不是指$a从变量中读取并替换它的指令,我指的是由 a$后跟一个. 组成的字符串a。)

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

当你这样做时:

subst [sum {$a} {$b}]

您需要了解对 的调用sum是在将参数组装到 时完成的subst。该调用会产生错误,因此调用subst永远不会发生。eval与您使用的表格类似。

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

subst {sum {$a} {$b}}

然后你会得到这个:sum {1} {2}subst不将整个字符串理解为脚本。另一方面,与:

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

在这种情况下,您得到的错误不是来自eval本身,而是来自对suminside 的调用仍然是错误的事实。

我想你可以这样做:

eval [subst {sum {$a} {$b}}]

但真的不要。必须有一种更简单且不易出错的方法。

于 2013-09-05T09:23:31.300 回答
1

你把方括号放[]错了地方(或者你甚至不需要它们eval)。在您编写命令的方式sum {$a} {$b}]中,在or命令可以评估and的内容之前评估。substeval$a$b

正确的是:

eval sum {$a} {$b}

或者

sum [subst {$a}] [subst {$b}]
于 2013-09-05T09:15:39.413 回答
0

你没有正确理解 Tcl。

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

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

sum [subst {$a} {$b}]

或修改总和为您进行评估:

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

expr进行自己的一轮评估,这就是为什么您通常向它传递一个文字字符串(用 括起来{}),但在这种情况下,我们实际上使用了这个事实。uplevel在调用者的上下文中执行命令。

如果你调用一个命令,Tcl 将在实际调用之前替换变量,所以也许这个片段可以帮助你更好地理解 Tcl:

set a pu
set b ts
$a$b "Hello World!"
于 2013-09-05T09:24:11.640 回答