tcl脚本,与[…]和[expr]斗争
我不明白赋值和变量的使用在Tcl中是如何工作的 即: 如果我做了类似的事情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] 运
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的独特之处之一(也很奇妙)。说真的,未知的处理程序对性能有很大影响。如果你不需要的话就不要用它们…