循环模拟在julialang



我是一个很好的人。我都快被用fortran写的julia模拟周期弄疯了。顺便说一下,goto语句在这个幼稚的尝试中不起作用:

x == y ? continue : goto mark1
mark1: 
println("hello")
提出了

:

syntax: extra token "mark1" after end of expression

在一个函数中,@goto现在已经实现了。

function example(y)
    for x in 1:1000
        x == y ? continue : @goto mark1
    end
    @label mark1
    println("hello")
end

查看更多信息:



虽然传统上不认为是循环,但@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

虽然两个例子都做同样的事情,但第二个例子更容易理解。但是,第一种方法性能更好(因为它避免了递归调用)。在大多数情况下,通话费用并不重要;但在有限的情况下,第一种形式是可以接受的。

我不完全确定这是一个格式良好的问题,但是在实现本地goto: https://github.com/JuliaLang/julia/issues/101时存在一个问题。甚至还有一个带有原型实现的拉取请求,但它有点停滞。

最新更新