TCL中是否有标签概念?

时间:2014-04-09 07:36:21

标签: switch-statement tcl labels

实际上我的要求是在选择标签时它会重定向到我已经给出描述的特定地方。

实施例

set a 20

switch -- $a {
"20" : goto check
"abc" : goto check1
}
Label 20:
puts "Given value is integer"
Label abc:
puts "Given value is alpha"

同样在TCL中有任何选项

1 个答案:

答案 0 :(得分:1)

Tcl根本不支持goto;它的低级语义与goto不兼容,尽管它们可以与几乎所有更高级别的概念(例如结构化编程,状态机等)一起工作。取而代之的取决于究竟是什么你在做什么玩具示例在这里并不是很有用。


直接goto的一个选项是使用tcl::unsupported::assemble(仅限Tcl 8.6)。

proc foo a {
    tcl::unsupported::assemble {
        expr {
            $a eq 20
        }
        jumpTrue check
        expr {
            $a eq "abc"
        }
        jumpTrue check2
        jump end
    label check
        eval {
            puts "Given value is integer"
        }
        pop
    label check2
        eval {
            puts "Given value is alpha"
        }
        pop
    label end
        # There *must* be one result value pushed onto the stack at the end
        push ""
    }
}

puts "before"
foo 20
puts "mid-1"
foo abc
puts "mid-2"
foo 3.14
puts "after"

这样,您就可以直接gotojumpTruejump;还有jumpFalse)来labelexpr evalexpr伪操作码允许您注入表达式评估或脚本,而不是手动编写所有内容。 然而,手工编写字节码会非常快速,并且不支持命令(因为我们不太喜欢我们的字节码)。这是怎么做的,但它确实不受鼓励。特别是,您需要注意正确管理评估堆栈; eval和{{1}}都推送一个值,整个字节码的净堆栈效果需要推送一个值(或抛出异常)。

此外,汇编程序不允许引擎知道的所有字节码指令。有些是受限制的,因为它们不安全(除了编译器如何使用它们)和其他因为我们不知道如何合理地描述它们!法律字节码的真正含义对...没什么帮助......