【问题标题】:TCL ternary expr does processing of outputTCL三元expr做输出处理
【发布时间】:2017-07-03 08:51:40
【问题描述】:

它涉及 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 显然不是这种情况。现在考虑 me 和 m1 的输出(请记住,如果调用 k,则会打印出“预期返回”):

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

因此,expr 和/或三元通过处理“返回”在“幕后”做一些事情。问题是:
1。它有什么作用?
2。怎么禁用?

【问题讨论】:

    标签: tcl ternary-operator expr


    【解决方案1】:

    因此,expr 和/或三元通过处理“返回”在“幕后”做一些事情。问题是:

    1. 它有什么作用?
    2. 如何禁用它?

    这不是三元,而是expr 的一般语义。该命令已记录并定义为尽可能返回 规范化 数值,并且规范化执行诸如将数值转换为十进制之类的事情。例如,它将023(看起来像一个八进制值)转换为19(= 2×81+3×80)。

    您不能在此区域更改expr;它是语义的定义部分(可能会在未来的版本中删除,但谁愿意等待呢?)。如果有问题,您需要使用您已有的 if 命令版本,因为它没有 convert-to-numeric-if-possible 语义。

    【讨论】:

    • 它还从写为十六进制 (0x1234)、新型八进制 (0o1234) 和二进制 (0b1010) 的常量标准化,但你不太可能通过事故。仍然支持旧式八进制,因为更改它将是一个重大更改,我们对这类事情非常保守,即使我们完全讨厌它并发现它会导致更多的问题而不是它可能值得......
    • 我可以建议一个标志来禁用规范化和强制转换吗?
    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    相关资源
    最近更新 更多