Seul un appel tient lieu d'instruction
Une instruction qui calcule une valeur et la jette est refusée — et ce refus achève de fermer le piège du signe =.
Maintenant qu’un appel peut rendre une valeur, il faut dire lesquelles ont le droit de tenir une ligne à elles seules. La réponse est courte : très peu.
@entry(demarrer)
object MonProgramme {
demarrer() {
var total := 12;
self.annoncer(valeur: total);
total := total + 5;
self.annoncer(valeur: total);
}
annoncer(valeur: int) {
Console.print(text: $"total : {valeur}");
}
}
Trois sortes d’instructions, et rien d’autre. self.annoncer(…) est un appel ;
total := total + 5 est une assignation ; une incrémentation, total++, en serait une
troisième.
Calculer et jeter est une erreur
Écrivez une ligne qui n’est qu’une expression — elle calcule une valeur que personne ne reçoit :
error[D023]: this statement has no effect: its value is computed and thrown away.
Only a call stands alone as a statement. If you meant to assign, the operator is ':=' — '=' compares
total + 1; calcule 18 et l’abandonne aussitôt. Rien n’a changé dans le programme, aucune trace
n’en reste : la ligne était sans effet, et le compilateur préfère vous le dire que la construire.
Seul un appel a une raison de tenir seul, puisque lui seul agit : il peut afficher, écrire, modifier. Qu’on garde ou non ce qu’il rend est votre affaire.
Ce que la règle protège vraiment
Relisez la fin du diagnostic : If you meant to assign, the operator is ':=' — '=' compares.
La section 3.1 avait retiré la moitié du piège le plus coûteux de la famille du C : if (x = 5)
n’existe pas ici, parce qu’une condition doit être un bool et qu’une assignation n’en est pas
une. Restait l’autre moitié — la ligne seule. Sans cette règle, total = 5; serait du code
légal et muet : une comparaison écrite par quelqu’un qui croyait assigner, dont le résultat
part à la poubelle, et que rien ne signale.
C’est cette dernière forme que D023 referme. La faute n’a désormais plus aucune forme dans
laquelle s’écrire.
À vous
- Remplacez
total := total + 5;partotal = 5;et lisez le diagnostic. Une seule lettre d’écart, et le compilateur voit exactement ce que vous vouliez faire. - Essayez
total + 1;, puistotal;tout seul. Même refus : ni l’un ni l’autre n’agit. - Remplacez la ligne par
self.annoncer(valeur: total + 5);. L’addition est toujours là, mais elle nourrit un appel au lieu de tomber dans le vide — et la dernière ligne affiche de nouveau 12, puisque rien n’a été rangé danstotal. Calculer et garder sont deux gestes distincts.