为什么Tcl expr不等于2个真布尔值?

为什么Tcl expr不等于2个真布尔值?,tcl,Tcl,我有这个剧本: $ cat tmp/bool.tcl puts "[expr [expr True] == [expr true] ]" 我希望它打印1,因为“True”和“True”都是布尔True,所以它们应该相等,但我得到0: $ tclsh tmp/bool.tcl 0 当然,这是简化的代码。实数代码生成字符串“True”、“True”、“Yes”、“Yes”等形式的布尔值 在比较它们之前,我是否必须将它们全部小写 我不明白为什么上面的代码不相等 % puts "[expr [exp

我有这个剧本:

$ cat tmp/bool.tcl
puts "[expr [expr True] == [expr true] ]"
我希望它打印1,因为“True”和“True”都是布尔True,所以它们应该相等,但我得到0:

$ tclsh tmp/bool.tcl
0
当然,这是简化的代码。实数代码生成字符串“True”、“True”、“Yes”、“Yes”等形式的布尔值

在比较它们之前,我是否必须将它们全部小写

我不明白为什么上面的代码不相等

% puts "[expr [expr True] == [expr true] ]"
0
让我们看看双方都做了什么:

% expr True
True
% expr true
true
因此,两者都被认为是布尔值,但并不相等。让我们将这些字符串转换为“规范”布尔形式:

% set a True
True
% set b true
true
% expr {$a == $b}
0
% expr {!!$a == !!$b}
1
这里发生了什么:一步一步

% expr {$a}
True
% expr {!$a}
0
% expr {!!$a}
1
本机“真/假”值分别为“1/0”。显然
1==1

点评:这感觉就像回到了Tcl的“一切都是一根弦”的根,“真”和“真”的弦是不相等的

让我们看看双方都做了什么:

% expr True
True
% expr true
true
因此,两者都被认为是布尔值,但并不相等。让我们将这些字符串转换为“规范”布尔形式:

% set a True
True
% set b true
true
% expr {$a == $b}
0
% expr {!!$a == !!$b}
1
这里发生了什么:一步一步

% expr {$a}
True
% expr {!$a}
0
% expr {!!$a}
1
本机“真/假”值分别为“1/0”。显然
1==1

观点:这感觉像是回到了Tcl的“一切都是字符串”的词根,字符串“True”和“True”是不相等的。

定义了要做的事(
expr
页面中的文档本身更加模糊):

如果可能,进行数字比较,否则进行精确字符串比较

True
True
都不是数字,因此使用精确的字符串比较。这两个值在其字符串表示的第一个字符中不同;因此,它们在
==
的意义上并不相等

若要比较非受控布尔值是否相等,请首先将它们反转为
的结果运算符既是布尔运算符又是数字运算符(即,它是0或1):

定义了要做的事情(
expr
页面中的文档本身比较模糊):

如果可能,进行数字比较,否则进行精确字符串比较

True
True
都不是数字,因此使用精确的字符串比较。这两个值在其字符串表示的第一个字符中不同;因此,它们在
==
的意义上并不相等

若要比较非受控布尔值是否相等,请首先将它们反转为
的结果运算符既是布尔运算符又是数字运算符(即,它是0或1):


我的回答暗示:1)您不需要嵌套
expr
调用;2) 在一些情况下,嵌套
expr
是有意义的。这不是其中之一。我的回答暗示:1)你不需要嵌套
expr
调用;2) 在一些情况下,嵌套
expr
是有意义的。这不是其中之一。我会使用下面的直接测试:
expr{$a&&$b}
。我会使用下面的直接测试:
expr{$a&&b}