# 6. Types, variables, constantes et scopes ## 6.1 Typage explicite — V1 REQUIS — FIGÉ Une variable possède un type explicite. Pas de `var`, `let` ou `auto` utilisé comme inférence générale de l'identité de type d'une variable. Les littéraux suivent les règles de contextual typing figées à la section 5.7 ; cela ne constitue pas une inférence générale du type des variables. ## 6.2 Definite assignment — V1 REQUIS — FIGÉ Une variable peut être déclarée sans valeur initiale seulement si le compilateur prouve qu'elle est assignée avant toute lecture. Une constante peut être assignée exactement une fois sur plusieurs chemins si le compilateur prouve l'unicité et la complétude de l'assignation. ## 6.3 Shadowing — V1 REQUIS — FIGÉ Le shadowing est interdit tant qu'une déclaration précédente de même nom est visible. Réutilisation autorisée après fin complète du scope précédent : ```text { int32 value = 1; } { int32 value = 2; } ``` Deux branches disjointes peuvent réutiliser le même nom. ## 6.4 Blocs anonymes — V1 REQUIS — FIGÉ Un bloc exécutable anonyme peut créer un scope à l'intérieur d'une fonction, méthode, `clsmethod`, `construct` ou `destruct`. Les blocs exécutables anonymes top-level sont interdits dans les sources ordinaires. ## 6.5 Ordre d'évaluation — V1 REQUIS — FIGÉ Les opérandes et arguments sont évalués de gauche à droite et une seule fois. Exemple : ```text foo(a(), b(), c()) ``` évalue `a()`, puis `b()`, puis `c()`. ---