Le contrôle par échec
Ce module est le plus important du parcours. Si tu viens de Blueprint, C++ ou C# et que tu n'as jamais programmé en Verse, c'est ici que ton intuition va le plus te trahir : Verse ne pense pas en booléens true/false pour son contrôle de flux, mais en échec. Une expression ne renvoie pas juste « faux » — elle peut littéralement échouer à produire une valeur du tout. Prends le temps de bien lire ce module, il conditionne tout ce qui suit.
Une expression peut échouer
Tu as déjà croisé l'indexation d'un tableau ou d'une map dans les problèmes de la banque libre. Regarde :
if (Item := Items[Index]):
Item
else:
"empty"
Items[Index] n'est pas une expression qui renvoie toujours une valeur, suivie d'un test à part — si Index est hors bornes, l'expression échoue directement, sans lever d'exception classique. Le if capte cet échec automatiquement : la branche then ne s'exécute que si Items[Index] a réussi à produire une valeur (liée ici au nom Item), sinon on passe directement à else. C'est la même mécanique pour une map : Catalog[Name] échoue si Name n'est pas une clé du catalogue.
Plusieurs conditions, séparées par des virgules
Une condition de if peut contenir plusieurs clauses séparées par des virgules — elles doivent toutes réussir pour que la branche then s'exécute, exactement comme un « et » logique :
if (SpellCount := Spellbook["Spell"], SpellCount >= 1, Mana >= RequiredMana):
true
else:
false
Si la clé "Spell" est absente, la première clause échoue déjà et on passe à else.
Astuce
Plusieurs clauses séparées par des virgules dans un if se comportent comme un and : elles doivent toutes réussir pour entrer dans le then. Dès qu'une clause échoue, les suivantes ne sont même pas évaluées.
L'opérateur ?
? déclenche manuellement un contrôle d'échec sur une seule expression : appliqué à une valeur logic, il échoue si elle vaut false ; appliqué à un option, il échoue si l'option est vide (et renvoie la valeur contenue si elle est pleine) — tu pratiqueras cet usage en détail avec le type option au module 5.
Quand l'utiliser
Utilise ? quand tu veux qu'un échec remonte directement, sans écrire de if/else — typiquement pour enchaîner plusieurs vérifications rapides à l'intérieur d'une fonction qui peut elle-même échouer. Dès que tu as besoin d'un chemin alternatif explicite (afficher un message, retomber sur une valeur par défaut), repasse par if/else.
Piège
? se colle à l'expression immédiatement à sa gauche, pas à toute la condition qui précède. X > 0? ne fait donc pas ce qu'on croit : le ? s'applique seulement à 0, pas à X > 0. Pour contrôler l'échec d'une comparaison entière, il faut la parenthéser explicitement : (X > 0)?.
and, or, not
Ces trois mots-clés combinent des conditions d'échec, comme dans la plupart des langages :
(Supplies >= RequiredSupplies and Stamina >= RequiredStamina) or HasSpecialPass
not inverse une condition : HP > 0 and not IsStunned n'est vrai que si HP est positif ET que le personnage n'est pas étourdi.
Quand l'utiliser
Combine tes conditions avec and/or/not quand elles portent sur une seule et même décision (plusieurs jauges à vérifier ensemble, par exemple). Dès que chaque échec doit mener à un message ou un comportement différent, préfère des if imbriqués : and/or ne disent pas quelle clause a échoué.
Enchaîner plusieurs branches
À retenir
Verse n'a pas de mot-clé elif dédié : pour enchaîner plusieurs branches, on imbrique un if dans le else du précédent.
Verse n'a pas de mot-clé elif dédié : pour enchaîner plusieurs branches, on imbrique un if dans le else du précédent :
if (HP > 100):
"high"
else:
if (HP > 30):
"medium"
else:
"low"
Ce que tu vas pratiquer
Les exercices de ce module sont plus nombreux que dans les autres — c'est volontaire, ce concept mérite d'être pratiqué sous plusieurs angles avant de passer aux boucles. Tu manipuleras l'échec via l'indexation de tableaux et de maps, les conditions à plusieurs clauses, les combinateurs and/or/not, et les chaînes de if/else imbriqués — sans avoir encore besoin de boucles ni du type option en détail, réservés aux modules suivants.
Contenu à valider manuellement dans un vrai environnement UEFN avant publication définitive (voir SPEC.md §7 — fidélité sémantique).