我无法理解变量的赋值和使用如何在Tcl中起作用。
即:
如果我做的话
set a 5
set b 10
我做了
set c [$a + $b]
按照互联网的说法:
通过将命令放在方形中来获取命令的结果 括号(
[]
)。这是后单的功能等同物 在sh编程中引用(`
),或使用函数的返回值 在C.
所以我的陈述应该c
设置为15
,对吧?
如果是,那与
set c [expr $a + $b]
? 如果不是,该声明的作用是什么?
答案 0 :(得分:2)
Tcl是一种非常严格的语言;它始终遵循规则。对于您的情况,我们可以这样分析它:
set c [$a + $b]
这是三个单词set
(即标准的“写入变量”命令),c
,以及我们通过评估[$a + $b]
中括号内容得到的结果。这又是一个由单个命令调用与另外三个单词组成的脚本,a
变量(5
),+
的内容以及{{1}的内容变量(b
)。值看起来像数字是无关紧要的:规则在所有情况下都是相同的。
由于您可能没有名为10
的命令,因此会出错。另一方面,如果你事先这样做了:
5
然后你的脚本将“工作”,将一些(明确定义的)完全无意义的单词写入proc 5 {x y} {
return "flarblegarble fleek"
}
变量。如果要评估某种数学表达式,可以使用c
命令;这是生活中的一项工作,要连接所有参数(用它们之间的空格),并使用它所理解的记录的小表达式语言将结果作为表达式进行评估。
你几乎总是想在表达式FWIW周围加上大括号。
还有其他方法可以让你所写的内容符合你的期望,但不要这样做。他们很慢。 OTOH,如果你愿意把expr
放在第一位,那么你就可以快速干扰并保持原状:
+
如果您不是Lisp风格前缀数学的粉丝,请使用# Get extra commands available for Lisp-like math...
namespace path ::tcl::mathop
set c [+ $a $b]
。毕竟,这是大多数Tcl程序员所做的事情。
答案 1 :(得分:1)
set c [$a + $b]
运行上述命令,您将收到invalid command name "5"
错误消息。
对于数学运算,我们应该仅依赖expr
,因为Tcl
将所有内容视为字符串。
set c [expr $a + $b]
在这种情况下,传递a
和b
的值并执行添加。
在这里,它始终是安全的,并建议将表达式括起来,
set c [expr {$a+$b}]
避免评估中出现任何意外情况。
更新1:
在Tcl
中,一切都基于命令。它可以是用户定义的proc
或现有的内置命令,例如lindex
。使用字符串的单词将触发命令调用。同样,[
和]
的使用也会触发相同的内容。
在您的情况下,$a
替换为变量a
的值,并且因为它们被括在方括号内,所以它会触发命令调用,因为没有名为{{1}的命令你收到了错误。