Menu

If/Else en Zero : le branchement conditionnel expliqué

Comment fonctionnent if et else en Zero : conditions booléennes, corps des branches, absence de coercition vers la vérité, et comment les conditionnels s'articulent avec match pour un branchement plus riche.

Cette page contient des éditeurs exécutables — modifiez, exécutez et voyez la sortie instantanément.

Les bases

if en Zero ressemble en gros à if dans tout autre langage de la famille C, avec une restriction notable : la condition doit être un bool.

La condition value == 42 est un bool parce que == entre deux i32 retourne un bool. Les deux branches contiennent chacune un bloc d'instructions. L'une ou l'autre peut être omise — le else est optionnel — mais quand les deux sont présentes, les deux doivent être des blocs { ... }.

L'exigence bool

Certains langages permettent d'écrire if value { ... } et traitent 0, "" ou null comme falsy. Zero ne le fait pas. La condition doit être un vrai bool.

let count = 0
if count {              // erreur de compilation : bool attendu, i32 reçu
    // ...
}

if count == 0 {         // OK
    check world.out.write("nothing to do\n")
}

La raison est la même que celle qui traverse le reste du langage : l'explicite l'emporte sur l'implicite. Un agent qui lit la seconde forme sait exactement ce qui est vérifié. La première forme laisse les règles de vérité implicites, et elles varient d'un langage à l'autre — Zero refuse de jouer.

Else et else-if

La clause else s'exécute quand la condition est fausse :

Chaînez des conditions avec else if :

if value < 0 {
    check world.out.write("negative\n")
} else if value == 0 {
    check world.out.write("zero\n")
} else {
    check world.out.write("positive\n")
}

else if n'est rien d'autre que else { if ... } avec les accolades omises — mêmes sémantiques, moins d'indentation. Le else final est optionnel.

D'où vient la condition

La condition peut être n'importe quoi qui s'évalue à bool :

  • Une liaison bool : if ok { ... }.
  • Une comparaison : if value == 42 { ... }, if x < y { ... }.
  • Une combinaison logique : if a && b { ... }, if pair.left == 1_u8 && pair.right == 2_u8 { ... }.
  • Un appel de fonction qui retourne bool : if isReady(world) { ... }.

Un snippet tiré d'exemples du langage :

let pair: BytePair = Pair { left: 1_u8, right: 2_u8 }
if pair.left == 1_u8 && pair.right == 2_u8 {
    check world.out.write("type alias ok\n")
} else {
    check world.out.write("type alias broke\n")
}

Le && court-circuite comme vous l'attendez — si le côté gauche est false, le côté droit n'est pas évalué. Pareil pour ||.

Quand préférer match

Les chaînes if/else if conviennent pour des décisions binaires ou ternaires, surtout quand les conditions ne partagent pas de structure. Mais quand vous branchez sur les variantes d'un type somme — un choice ou un enummatch est le bon outil.

Comparez :

// match — exhaustif, vérifié par le compilateur
match result {
    .ok  => value   { check world.out.write("ok\n") }
    .err => message { check world.out.write("err\n") }
}

vs.

// if/else sur un type somme — verbeux et plus facile à rater
if result.isOk() {
    let value = result.unwrap()
    check world.out.write("ok\n")
} else {
    check world.out.write("err\n")
}

La forme match rend l'analyse des variantes explicite et le compilateur se plaindra si une variante est ajoutée plus tard et que vous oubliez de la gérer. La forme if laisse passer en silence tout ce qui n'est pas ok dans la branche else, y compris des variantes toutes neuves auxquelles vous n'avez jamais pensé.

Règle du pouce : if pour les booléens, match pour les variantes.

Notes de style

Quelques petites conventions qui rendent le code plus lisible pour les humains comme pour les agents :

  • Mettez toujours des accolades autour du corps. Même un corps d'une ligne va dans { ... }. Il n'y a pas de forme à instruction unique sans accolade. C'est voulu — ça garde l'indentation fiable et supprime une source de bugs courante de la famille C.
  • Mettez la branche la plus courante en premier. Les lecteurs (et les agents) parcourent de haut en bas.
  • Préférez les conditions positives quand elles sont aussi claires. if isReady est plus facile à suivre que if !notReady, toutes choses égales par ailleurs.

La suite : les boucles while

Les conditionnels décident quoi faire ; les boucles décident combien de fois le faire. Le prochain document couvre les boucles while de Zero, la construction de boucle de la version actuelle du langage.

Questions fréquentes

Comment fonctionnent les instructions if en Zero ?

Utilisez if condition { ... } avec une clause else { ... } optionnelle. La condition doit être un bool — Zero ne convertit pas les entiers, chaînes ou autres valeurs en booléen. Exemple : if value == 42 { check world.out.write("yes\n") } else { check world.out.write("no\n") }.

Zero a-t-il un opérateur ternaire ?

Zero garde délibérément la surface petite et utilise des blocs if / else plutôt qu'un ternaire condition ? a : b séparé. Les exemples officiels privilégient des branches explicites même pour les cas courts. Si votre langage supporte les if comme expressions, attendez-vous à ce que Zero penche dans cette direction plutôt que d'introduire une seconde syntaxe.

Peut-on chaîner if/else if en Zero ?

Oui. Chaînez des conditions en écrivant else if entre les branches : if a { ... } else if b { ... } else { ... }. Pour des branchements plus élaborés sur un choice ou un enum, préférez match — il est plus exhaustif et le compilateur vérifie que vous avez géré chaque variante.

Pourquoi Zero ne convertit-il pas les valeurs en bool ?

La philosophie de conception de Zero, c'est « tout est explicite ». La vérité implicite — traiter 0, "" ou null comme faux — est une source fréquente de bugs et difficile à raisonner précisément pour un agent. Exiger un vrai bool rend la décision de branchement visible dans le code et plus facile à vérifier mécaniquement.

Quand utiliser match plutôt que if/else ?

Utilisez match quand vous branchez sur les variantes d'un choice ou d'un enum. Le compilateur peut vérifier que vous avez couvert tous les cas, ce que les chaînes if/else if ne peuvent pas. Gardez if/else pour les prédicats booléens simples — vérifications d'égalité, comparaisons, branchements binaires courts.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER