TCL三元expr进行输出处理

TCL三元expr进行输出处理,tcl,ternary-operator,expr,Tcl,Ternary Operator,Expr,它涉及TCL8.6,是从我得到的关于这个问题的答案中派生出来的 所以,考虑这个代码: 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

它涉及TCL8.6,是从我得到的关于这个问题的答案中派生出来的 所以,考虑这个代码:

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的情况。现在考虑ME和M1的输出(记住,如果调用k,则打印出“预期返回”):

因此,expr和/或三元函数通过处理“returnal”来“在引擎盖下”做一些事情。问题是:
1。它有什么作用?
2。它怎么能被禁用

因此,expr和/或三元函数通过处理“returnal”来“在引擎盖下”做一些事情。问题是:

  • 它有什么作用
  • 它怎么能被禁用
  • 这不是三元语义,而是
    expr
    的一般语义。该命令被记录并定义为在可能的情况下返回一个标准化的数值,标准化可以将数值转换为十进制。例如,它将
    023
    (看起来像一个八进制值)转换为
    19
    (=2×81+3×80)


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

    它还可以将以十六进制(
    0x1234
    )、新型八进制(
    0o1234
    )和二进制(
    0b1010
    )形式写入的常量标准化,但你不太可能意外地击中它们。旧式八进制仍然受到支持,因为改变它将是一个突破性的改变,我们对这类事情非常保守,尽管我们非常讨厌它,发现它导致的问题比它可能值得的多…我可以建议一个标志来禁用正常化和铸造吗?
    puts [ me 23 0 ]
    >returnal should be "023"
    >19
    puts [ me1 23 0 ]
    >returnal should be "023"
    >023