向 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 引數選擇是否在條件為真時進行迭代,或者直到它為假,這與在條件的邏輯否定為真時進行迭代相同。如果給出了意外的關鍵字,則會生成錯誤訊息。