关于 TCL 中条件语句的有趣行为

Interesting behavior about condition statement in TCL

这可能是个愚蠢的问题。但是我刚刚在TCL中发现了一件令人困惑的事情。

下面是示例代码。

set x test_string

if {$x==y} {
    puts "Matching!"
} else {
    puts "Not matching."
}

if {$x==z} {
    puts "Matching!"
} else {
    puts "Not matching."
}

当我 运行 这段代码时,它以以下错误结束。

invalid bareword "z"
in expression "$x==z";
should be "$z" or "{z}" or "z(...)" or ...
    (parsing expression "$x==z")
    invoked from within
"if {$x==z} {
        puts "Matching!"
} else {
        puts "Not matching."
}"
    (file "test.tcl" line 3)

我知道当我们与字符串进行比较时,字符串应该被引用。所以下面的更有意义。

if {$x=="y"} {
    puts "Matching!"
} else {
    puts "Not matching."
}

if {$x=="z"} {
    puts "Matching!"
} else {
    puts "Not matching."
}

不过让我好奇的是,好像字符y不会导致这样的错误。

有人可以对此做一些解释吗?我不知道这里的 y 有什么特别之处。

谢谢!

因为布尔值不需要被引用。

% expr true
true
% expr false
false
% expr not_a_boolean
invalid bareword "not_a_boolean"
...

参见 Tcl_GetBoolean 手册页:

Tcl_GetBoolean expects src to specify a boolean value. If src is any of 0, false, no, or off, then Tcl_GetBoolean stores a zero value at *boolPtr. If src is any of 1, true, yes, or on, then 1 is stored at *boolPtr. Any of these values may be abbreviated, and upper-case spellings are also acceptable.

yyes的明确缩写,一个true