輸入驗證

雖然傳統上不考慮迴圈,但 @goto@label 巨集可用於更高階的控制流程。一個用例是當一個部分的失敗導致整個函式的重試時,通常在輸入驗證中有用:

function getsequence()
    local a, b

@label start
    print("Input an integer: ")
    try
        a = parse(Int, readline())
    catch
        println("Sorry, that's not an integer.")
        @goto start
    end

    print("Input a decimal: ")
    try
        b = parse(Float64, readline())
    catch
        println("Sorry, that doesn't look numeric.")
        @goto start
    end

    a, b
end

但是,使用遞迴通常更清楚這個用例:

function getsequence()
    local a, b

    print("Input an integer: ")
    try
        a = parse(Int, readline())
    catch
        println("Sorry, that's not an integer.")
        return getsequence()
    end

    print("Input a decimal: ")
    try
        b = parse(Float64, readline())
    catch
        println("Sorry, that doesn't look numeric.")
        return getsequence()
    end

    a, b
end

雖然兩個例子都做同樣的事情,但第二個更容易理解。但是,第一個更高效能(因為它避免了遞迴呼叫)。在大多數情況下,通話費用無關緊要; 但在有限的情況下,第一種形式是可以接受的。