Section 3.1

Comparer

Les six comparaisons, et la réponse à la question laissée en suspens sur le signe =.

Comparer deux valeurs donne un bool — true ou false. Vous en avez déjà croisé un sans y prêter attention : la variable inscrit de la sous-section « Montrer une valeur ».

@entry(demarrer)
object MonProgramme {
    demarrer() {
        var age := 42;

        Console.print(text: $"age vaut-il 42 ? {age = 42}");
        Console.print(text: $"age diffère-t-il de 42 ? {age != 42}");
        Console.print(text: $"age dépasse-t-il 18 ? {age > 18}");
        Console.print(text: $"age atteint-il 18 ? {age >= 18}");
    }
}

Quatre questions, quatre réponses.

= compare, et n’assigne jamais

Voici la réponse promise en 2.1. Le signe = est réservé à l’égalité : age = 42 ne met pas 42 dans age, il demande si age vaut 42, et rend true ou false.

C’est pour cela qu’assigner s’écrit :=. Chaque geste a son propre signe, et le signe d’égalité veut dire ce qu’il veut dire en mathématiques depuis toujours.

Il n’y a donc pas de == dans ce langage. Là où le C, le Java ou le Python écrivent = pour assigner et == pour comparer, Archon n’a pas besoin de doubler le signe pour distinguer les deux — ils ne se ressemblent déjà pas.

Le gain n’est pas cosmétique. La confusion entre = et == est une des fautes les plus anciennes et les plus coûteuses de la famille du C : if (x = 5) y est du code parfaitement valide, qui assigne là où on voulait comparer, et qui passe sans un mot. Ici la faute n’a pas de forme : on ne peut pas écrire l’un en croyant écrire l’autre.

Les six

écritvrai quand
a = bles deux valent la même chose
a != belles diffèrent
a < ba est strictement plus petit
a > ba est strictement plus grand
a <= ba est plus petit, ou égal
a >= ba est plus grand, ou égal

!= se lit « différent de ». C’est le seul endroit du langage où le point d’exclamation paraît : il est réservé à cet usage, et la négation, elle, s’écrit en toutes lettres — on la verra en 3.3.

Les textes se comparent aussi

= ne sert pas qu’aux nombres. Deux textes se comparent par leur contenu :

var mot := "Alexandrie";
Console.print(text: $"{mot = "Alexandrie"}");   // true

Deux textes identiques sont égaux, même s’ils ont été écrits à deux endroits différents du programme.

À vous

  • Changez 42 en une autre valeur dans les quatre questions et prédisez chaque réponse avant d’exécuter.
  • Comparez deux textes qui ne diffèrent que par une majuscule — "simon" = "Simon". La comparaison est exacte, elle ne pardonne rien.
  • Écrivez age = 43; seul sur une ligne, comme une instruction. Le compilateur refuse — une comparaison dont on jette le résultat ne fait rien — et il nomme au passage le signe que vous vouliez peut-être.