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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow