在julialang中循环模拟

时间:2014-03-26 19:26:34

标签: julia

我是一个非常强大的人。我在fortran中用一个类似循环的julia模型让我失去理智。 顺便说一句,goto语句在这个天真的尝试中并不起作用:

x == y ? continue : goto mark1

mark1: 
println("hello")

提出:

syntax: extra token "mark1" after end of expression

2 个答案:

答案 0 :(得分:2)

在一个函数中,@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

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

答案 1 :(得分:0)

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