2012-09-13 93 views
1

我想知道如何在tcl中实现GOTO。 我正在写一个测试案例,我说5个步骤。 如果我的第一步失败了,我不想继续下去,我想跳过现有的东西并转到一个共同的清理部分。如何在tcl中实现goto

如果在tcl中有任何GOTO命令,请帮助我。

谢谢, Ramya。

回答

3

Tcl中有nogoto,由于相对技术上的原因,不可能实现一个。

但是你可以通过其他方式做你想做的事。既然你正在处理测试用例,我希望你使用tcltest包作为工作。就这样,你可以指定清理代码很容易:

tcltest::test test-1.1 "verify that the foo works" -setup { 
    allocate some resources 
} -body { 
    whatever to do the test... 
    return [our results] 
} -cleanup { 
    drop those resources 
    make sure that we are nice and clean 
} -result "the expected test result" 

你可以只是做了return跳过了测试的身体很容易; tcltest::test命令将检测到它并将其视为结果。通常尽量保持每个测试独立于其他测试通常会更好:这样可以更轻松地找出测试失败时发生的问题。

如果您不使用tcltest,那么您仍然可以最好地重构一些可以使用return提前跳过的东西。您可以结合起来,与try…finally…(无论是本地使用Tcl 8.6,或this code on the Tcler's Wiki)让一切变得简单:

proc doThings {} { 
    try { 
     # do thing-1 
     if {$no_more} return 
     # do thing-2 
     if {$no_more} return 
     # do thing-3 
     if {$no_more} return 
     # do thing-4 
     if {$no_more} return 
     # do thing-5 
    } finally { 
     # do cleanup 
    } 
} 
+0

真正块'goto'是,它很难得到陈述权的标签问题 - 而我们可以处理异常冒出的块中的标签,当前不在执行上下文中的子块中的任何标签都将不可见 - 如果没有这些标签,则实际上根本无法到达任何位置;可能会为内置命令添加特殊情况,但会违背语言的精神。尽管如此,其他更高级的句法结构也是可能的,所以在实践中不会感觉到'goto'的缺失。 –

+0

或者你可以使用[TAL](http://wiki.tcl.tk/28070)来编写,但这不适合胆怯的人! –