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