向 Tcl 添加新的控制结构

在 Tcl 中,控制结构基本上只是另一个命令。这是 do ... while / do ... until 控制结构的一种可能实现方式。

proc do {body keyword expression} {
    uplevel 1 $body
    switch $keyword {
        while {uplevel 1 [list while $expression $body]}
        until {uplevel 1 [list while !($expression) $body]}
        default {
            return -code error "unknown keyword \"$keyword\": must be until or while"
        }
    }
}

两种 do 循环的共同之处在于,名为 body 的脚本将始终至少执行一次,因此我们立即执行此操作。调用 uplevel 1 $body 意味着在调用者的堆栈级别执行脚本。这样,脚本使用的所有变量都是可见的,并且生成的任何结果都将保持在调用者的级别。然后,脚本根据 keyword 参数选择是否在条件为真时进行迭代,或者直到它为假,这与在条件的逻辑否定为真时进行迭代相同。如果给出了意外的关键字,则会生成错误消息。