TCL ternary expr 做输出的处理

TCL ternary expr does processing of output

涉及TCL 8.6,来源于我在issue上得到的答案 因此,请考虑以下代码:

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 应该 return 相同的值(如果类似的代码是用 Ruby 或 PERL 编写的,他们实际上是这样做的)。 TCL 显然不是这样。现在考虑 me 和 m1 的输出(记住,如果调用 k,则打印出 "expected return"):

puts [ me 23 0 ]
>returnal should be "023"
>19
puts [ me1 23 0 ]
>returnal should be "023"
>023

所以,expr and/or 三进制正在做一些事情 "under the hood",通过处理 "returnal"。问题是:
1。它有什么作用?
2.如何禁用它?

So, expr and/or the ternary are doing something "under the hood", by processing the "returnal". The question are:

  1. What does it do?
  2. How can it be disabled?

这不是三元组,而是 expr 的一般语义。如果可能的话,该命令被记录并定义为 return 一个 标准化 数值,并且标准化会执行诸如将数值转换为十进制之类的操作。例如,它将 023(看起来像八进制值)转换为 19(= 2×81+3×8 0).

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