如何测试 expr == 在字符串上的不当使用?

How to test for improper use of expr == on strings?

expr 中使用 == 可能会导致同样符合双精度条件的字符串出现意外行为。一个例子是 if {$a == $b} 当 a=1.0 和 b=1 时。我想 == 甚至适用于字符串 post 8.4 的原因是向后兼容尚未用 eq 替换它的脚本。

有没有一种(简单的)方法可以在运行时检测到这一点,并可能在测试期间发现所有错误使用?比如激活“严格”模式之类的?

Tcl,设计, 没有这么简单的检查方法。 (在 8.6 之后,有一个不受支持的命令,tcl::unsupported::representation,它可以做部分检查,但它并没有真正做你想做的,尤其是文字。)真正的问题是在逻辑类型中-在 Tcl 系统中,字符串是所有其他值类型的超类型,因此所有其他值类型都可以序列化为字符串,并且保证可以工作(前提是您有足够的内存)。

但是有一些方法可以通过执行需要数字的操作来强制使用数字,最简单的可能就是在参数前面添加一元 +

if {+$x == +$y} { ...

可以使用 $x | 0$x ^ 0 来强制使用整数。通常不需要强制执行与数字性不同的浮点性。如果您真的需要它,string is 有您需要的各种支票,但它们可能会很贵。


除非明确指出,否则上述所有内容适用于本千年以来的所有 Tcl 版本。

Tcl 中已知的运算符(&&、|| 和 ? : 除外)在 tcl::mathop 命名空间中可用。不幸的是,与 tcl::mathfunc 命名空间中的函数相反,重新定义 tcl::mathop::== 对 expr 处理 '==' 的方式没有影响。

恐怕除了更改 Tcl C 代码外,唯一的方法就是重新定义 expr 和其他将算术表达式作为参数的命令(如果, , 尽管)。解析表达式参数,将其分成两部分,放在 == 的两边,同时考虑优先顺序。然后将每个部分通过原始expr并检查结果是否满足string is double -strict.

这不是一个简单的练习,可能还会大大减慢脚本的执行速度。