1

它涉及 TCL 8.6,并且源自我在问题Nitpicking: Tcl storage in a variable or not, for speed, in procedure中得到的答案 所以,请考虑以下代码:

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. 怎么禁用?

4

1 回答 1

2

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

  1. 它有什么作用?
  2. 怎么可能禁用?

这不是三元,而是expr. 该命令已记录并定义为尽可能返回规范化的数值,并且规范化执行诸如将数值转换为十进制的操作。例如,它将023(看起来像八进制值)转换为19(= 2×8 1 +3×8 0)。

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

于 2017-07-03T10:09:41.277 回答