Julia Language
@goto et @label
Recherche…
Syntaxe
- @goto label
- @label label
Remarques
L'utilisation excessive ou inappropriée d'un flux de contrôle avancé rend le code difficile à lire. @goto
ou ses équivalents dans d'autres langues, lorsqu'il est utilisé de manière incorrecte, conduit à un code spaghetti illisible.
Semblable à des langages comme C, on ne peut pas sauter entre les fonctions de Julia. Cela signifie également que @goto
n'est pas possible au niveau supérieur; cela ne fonctionnera que dans une fonction. De plus, on ne peut pas sauter d'une fonction interne à sa fonction externe ou d'une fonction externe à une fonction interne.
Validation des entrées
Bien @label
ne soient généralement pas considérées comme des boucles, les macros @goto
et @label
peuvent être utilisées pour un flux de contrôle plus avancé. Un cas d'utilisation est le cas où la défaillance d'une partie devrait conduire à la tentative d'une fonction entière, souvent utile pour la validation des entrées:
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
Cependant, ce cas d'utilisation est souvent plus clair en utilisant la récursion:
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
Bien que les deux exemples fassent la même chose, le second est plus facile à comprendre. Cependant, le premier est plus performant (car il évite l’appel récursif). Dans la plupart des cas, le coût de l'appel n'a pas d'importance; mais dans des situations limitées, le premier formulaire est acceptable.
Nettoyage d'erreur
Dans des langages tels que C, l'instruction @goto
est souvent utilisée pour garantir qu'une fonction nettoie les ressources nécessaires, même en cas d'erreur. Ceci est moins important chez Julia, car les exceptions et les blocs try
- finally
sont souvent utilisés à la place.
Cependant, il est possible que le code Julia s'interface avec le code C et les API C, et il faut donc parfois écrire des fonctions comme du code C. L'exemple ci-dessous est conçu, mais illustre un cas d'utilisation courant. Le code Julia appellera Libc.malloc
pour allouer de la mémoire (ceci simule un appel de l'API C). Si toutes les attributions n'aboutissent pas, alors la fonction devrait libérer les ressources obtenues jusqu'à présent; sinon, la mémoire allouée est renvoyée.
using Base.Libc
function allocate_some_memory()
mem1 = malloc(100)
mem1 == C_NULL && @goto fail
mem2 = malloc(200)
mem2 == C_NULL && @goto fail
mem3 = malloc(300)
mem3 == C_NULL && @goto fail
return mem1, mem2, mem3
@label fail
free(mem1)
free(mem2)
free(mem3)
end