tcl脚本,与[…]和[expr]斗争

tcl脚本,与[…]和[expr]斗争,tcl,Tcl,我不明白赋值和变量的使用在Tcl中是如何工作的 即: 如果我做了类似的事情 set a 5 set b 10 我也是 set c [$a + $b] 按照互联网上的说法: 通过将命令放置在正方形中,可以获得命令的结果 括号([])。这是功能相当于单曲的背部 在sh编程中引用(`),或使用函数的返回值 在C 所以我的语句应该将c设置为15,对吗? 如果是的话,这两种方法有什么区别 set c [expr $a + $b] ?? 如果否,该声明的作用是什么 set c [$a + $b] 运

我不明白赋值和变量的使用在Tcl中是如何工作的

即:

如果我做了类似的事情

set a 5
set b 10
我也是

set c [$a + $b]
按照互联网上的说法:

通过将命令放置在正方形中,可以获得命令的结果 括号(
[]
)。这是功能相当于单曲的背部 在sh编程中引用(
`
),或使用函数的返回值 在C

所以我的语句应该将
c
设置为
15
,对吗? 如果是的话,这两种方法有什么区别

set c [expr $a + $b]
?? 如果否,该声明的作用是什么

set c [$a + $b]
运行上述命令时,您将收到
无效命令名“5”
错误消息

对于数学运算,我们应该只依赖于
expr
,因为
Tcl
将一切都视为字符串

set c [expr $a + $b]
在这种情况下,传递
a
b
的值并执行加法

在这里,总是安全的,建议将表达式括起来,如下所示:

set c [expr {$a+$b}]
避免评估中可能出现的意外情况

更新1:

Tcl
中,一切都基于命令。它可以是用户定义的
proc
或现有的内置命令,如
lindex
。使用字符串的裸字将触发命令调用。类似地,使用
[
]
也会触发相同的事件


在您的情况下,
$a
替换为变量
a
的值,并且由于它们被括在方括号内,因此会触发命令调用,并且由于没有名为
5
的命令,因此您将得到错误

Tcl的核心是一种非常严格的语言;它总是遵循规则。因此,对于您的情况,我们可以这样分析:

set c [$a + $b]
这是三个词,
set
(即标准的“写入变量”命令),
c
,以及我们通过计算
[$a+$b]
中括号的内容得到的结果。这又是一个脚本,由单个命令调用和另外三个字组成,
a
变量(
5
)、
+
,以及
b
变量(
10
)的内容。这些值看起来像数字是不相关的:在所有情况下规则都是相同的

由于您可能没有名为
5
的命令,因此会出现错误。另一方面,如果您事先这样做:

proc 5 {x y} {
    return "flarblegarble fleek"
}
然后您的脚本将“工作”,将一些(明确定义的)完全无意义的单词写入
c
变量。如果要计算某种数学表达式,可以使用
expr
命令;这是生活中的一项工作,连接所有的参数(它们之间有一个空格),并使用它能理解的有文档记录的小表达式语言作为表达式计算结果

实际上,您总是希望在表达式FWIW周围加上大括号


还有其他方法可以让你写的东西达到你期望的效果,但不要这样做。他们很慢。OTOH,如果你愿意把
+
放在第一位,你可以让东西在干扰最小的情况下快速运行:

# Get extra commands available for Lisp-like math...
namespace path ::tcl::mathop

set c [+ $a $b]

如果您不喜欢Lisp风格的前缀数学,请使用
expr
。毕竟,这是大多数Tcl程序员所做的。

这正是我所犯的错误。为什么它会返回那个错误?执行什么操作?
[5+10]
尝试运行名为
5
的命令,该命令带有参数
+
10
。如错误所示,没有名为
5
的命令。那么它是否会将$a的结果解释为字符串?@user8469759同样,这也是tcl的独特之处之一(也很奇妙)。说真的,
未知的
处理程序对性能有很大影响。如果你不需要的话就不要用它们…