Section 5.3

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; par total = 5; et lisez le diagnostic. Une seule lettre d’écart, et le compilateur voit exactement ce que vous vouliez faire.
  • Essayez total + 1;, puis total; 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é dans total. Calculer et garder sont deux gestes distincts.