它涉及TCL 8.6,源于我在问题Nitpicking: Tcl storing in a variable or not, for speed, in procedures上得到的答案 所以,请考虑以下代码:
proc me1 { in1 in2 } {
if { $in1 > $in2 } {
return [ k $in1 ]
} else {
return [ k2 $in2 $in1 ]
}
}
proc me { in1 in2 } {
expr { $in1 > $in2 ? [ k $in1 ] : [ k2 $in2 $in1 ] }
}
proc k {in1 } {
puts "returnal should be \"0${in1}\""
return "0${in1}"
}
proc k2 { in1 in2 } {
return "01${in1}00 ${in2}"
}
似乎procs me和me1应该返回相同的值(如果类似的代码是用Ruby或PERL编写的,它们实际上是这样做的)。这在TCL中绝对不是这样。现在考虑我和m1的输出(记住,如果调用k,"预期返回"打印出来):
puts [ me 23 0 ]
>returnal should be "023"
>19
puts [ me1 23 0 ]
>returnal should be "023"
>023
所以,expr和/或三元组正在做什么"在引擎盖下#34;通过处理" returnal"。问题是:1。它做了什么?
2。如何禁用它?
答案 0 :(得分:2)
因此,expr和/或三元组正在通过处理“回归”来做“引擎盖下”的事情。问题是:
- 它做了什么?
- 如何禁用?
醇>
这不是三元组,而是expr
的一般语义。该命令被记录并定义为在可能的情况下返回规范化数值,并且规范化会将数值转换为十进制。例如,它会将023
(看起来像八进制值)转换为19
(= 2×8 1 + 3×8 0 )。
您无法在此区域更改expr
;它是语义的一个已定义的部分(可能在将来的版本中被删除,但是谁想要等待呢?)。如果这是一个问题,您需要使用已有的if
命令版本,因为它没有转换为数字,如果可能的语义。