TCL三元expr处理输出

时间:2017-07-03 08:51:40

标签: tcl ternary-operator expr

它涉及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。如何禁用它?

1 个答案:

答案 0 :(得分:2)

  

因此,expr和/或三元组正在通过处理“回归”来做“引擎盖下”的事情。问题是:

     
      
  1. 它做了什么?
  2.   
  3. 如何禁用?
  4.   

这不是三元组,而是expr的一般语义。该命令被记录并定义为在可能的情况下返回规范化数值,并且规范化会将数值转换为十进制。例如,它会将023(看起来像八进制值)转换为19(= 2×8 1 + 3×8 0 )。

您无法在此区域更改expr;它是语义的一个已定义的部分(可能在将来的版本中被删除,但是谁想要等待呢?)。如果这是一个问题,您需要使用已有的if命令版本,因为它没有转换为数字,如果可能的语义。