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命令应该执行变量和命令替换。但为什么我的变量不是替代的。
任何人都可以解释一下发生了什么吗?
答案 0 :(得分:2)
首先,您了解为什么“$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
,而是来自内部对sum
的调用仍然是错误的。
我想你可以这样做:
eval [subst {sum {$a} {$b}}]
但实际上并非如此。必须有一种更简单且不易出错的方式。
答案 1 :(得分:1)
您将方括号[]
放在错误的位置(相反,您甚至在eval
情况下不需要它们)。在您编写命令的方式中,sum {$a} {$b}]
在之前评估 subst
或eval
命令可以评估$a
和{{1}的内容}}
正确的是:
$b
或
eval sum {$a} {$b}
答案 2 :(得分: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会在执行callall之前替换变量,所以也许这个片段可以帮助你更好地理解Tcl:
set a pu
set b ts
$a$b "Hello World!"