tcl脚本,与[...]和[expr ...]

时间:2016-10-31 15:46:34

标签: tcl

我无法理解变量的赋值和使用如何在Tcl中起作用。

即:

如果我做的话

set a 5
set b 10

我做了

set c [$a + $b]

按照互联网的说法:

  

通过将命令放在方形中来获取命令的结果   括号([])。这是后单的功能等同物   在sh编程中引用(`),或使用函数的返回值   在C.

所以我的陈述应该c设置为15,对吧? 如果是,那与

有什么不同
set c [expr $a + $b]

? 如果不是,该声明的作用是什么?

2 个答案:

答案 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]

在这种情况下,传递ab的值并执行添加。

在这里,它始终是安全的,并建议将表达式括起来,

set c [expr {$a+$b}]

避免评估中出现任何意外情况。

更新1:

Tcl中,一切都基于命令。它可以是用户定义的proc或现有的内置命令,例如lindex。使用字符串的单词将触发命令调用。同样,[]的使用也会触发相同的内容。

在您的情况下,$a替换为变量a的值,并且因为它们被括在方括号内,所以它会触发命令调用,因为没有名为{{1}的命令你收到了错误。