2013-07-21 57 views
4

爲什麼這不像我想的那樣工作?爲什麼tcl的「if」返回值?

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如何保持undefined?

回答

7

參見http://www.tcl.tk/man/tcl8.6/TclCmd/return.htm

返回代碼在Tcl的用於控制程序流程。 Tcl腳本是一系列Tcl命令。只要每個命令評估返回代碼爲TCL_OK的返回碼,評估將繼續到腳本中的下一個命令。由命令評估返回的任何異常返回碼(非TCL_OK)都會導致流向下一個命令的流被中斷。腳本評估停止,命令中的例外返回碼成爲完整腳本評估的返回碼。這是在腳本評估過程中出現錯誤導致調用堆棧中斷和解除的機制。它也是命令如中斷,繼續返回的命令導致腳本評估終止而不按順序評估所有命令的機制。

所以劇本的評價被中止,x不被設置,並且2返回並打印結果。

6

expr命令返回一個值,所以

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

但是,如果你這樣做,你還不如用三元運算符

set x [expr {1 ? 2 : 3}] 
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}] 
相關問題