为什么没有tcl的“if”返回值?

时间:2013-07-21 23:01:42

标签: tcl ternary-operator

为什么这不像我想的那样起作用?

set x [if {1} {return 2} {return 3}]

命令输出显示2,但是当您检查x的值时,会发现它未定义..!

我已经阅读了一个解决方法,......

proc give {x} {return $x}
set x [if {1} {give 2} {give 3}]

...但我不明白为什么第一个不起作用。

来自the tcl 8.5 documentation for if

  

“命令的返回值是执行的正文脚本的结果,如果没有表达式非零并且没有bodyN,则为空字符串。”

问题:

  1. 为什么set x [if {1} {return 2} {return 3}]没有为x设置值?
  2. 鉴于set x [if {1} {return 2} {return 3}]不起作用,tclsh如何在交互式shell上显示“2”?
  3. 鉴于tclsh在交互式shell上显示“2”,set x如何保持未定义?

3 个答案:

答案 0 :(得分:7)

请参阅http://www.tcl.tk/man/tcl8.6/TclCmd/return.htm

  

返回代码在Tcl中用于控制程序流程。 Tcl脚本是一系列Tcl命令。只要每个命令评估返回 TCL_OK 的返回代码,评估将继续执行脚本中的下一个命令。命令评估返回的任何异常返回代码(非 TCL_OK )都会导致中断下一个命令的流程。脚本评估停止,命令的异常返回代码成为完整脚本评估的返回代码。这是脚本评估期间错误导致调用堆栈中断和展开的机制。这也是中断继续返回等命令导致脚本评估终止而不按顺序评估所有命令的机制。

因此中止了对脚本的评估,x未设置,并且返回2并作为结果打印。

答案 1 :(得分:7)

expr命令返回一个值,所以

set x [if 1 {expr 2} {expr 3}]

但如果你这样做,你也可以使用三元运算符

set x [expr {1 ? 2 : 3}]

答案 2 :(得分:2)

正如已经指出的那样,set x [if {1} {return 2} {return 3}]不能按预期方式工作的原因是return是一个导致脚本评估终止的命令。使用give过程的“变通方法”演示了这样一个事实:默认情况下,return命令会终止调用堆栈的1级。

然而,“变通方法”在受虐狂中实际上是毫无意义的:return命令允许您使用Tcl 8.5中引入的-level选项指定返回的位置。试试这个,看看它是如何运作的。

set x [if {1} {return -level 0 2} {return -level 0 3}]