我是一个很好的人。我都快被用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时存在一个问题。甚至还有一个带有原型实现的拉取请求,但它有点停滞。