EGAL

 

Pour vérifier l'égalité de deux éléments

Syntaxe :  ( =  num1 [num2, num3 ...])

Arguments : num1,num2... des valeurs numériques, entiers ou réels

Valeur renvoyée : T si l'égalité est avérée, nil dans le cas contraire.

Il est possible de comparer plus de deux éléments, mais si un seul des éléments ne respecte pas l'égalité, la valeur renvoyée est nil.

( = 1 1 1 1 ) renvoie T, car tous les arguments sont égaux (valeurs parfaitement égales)

( = 1 1 1 1.00001 ) renvoie nil, car un argument est différent des autres, 1.00001 ne vaut pas 1 exactement, eh oui, c'est précis ! un seul qui est différent des autres et c'est nil qui est renvoyé !

En cas de contrôle d'égalité de chaînes de caractères (string) le logiciel est sensible à la casse, c'est-à-dire que les majuscules et minuscules ne sont pas considérées comme égales.

( = "maison" "maison" ) renvoie T, c'est égal, rien à redire.

( = "maison" "Maison" ) renvoie nil, les deux chaînes (string) ne sont pas considérées comme égales à cause de la majuscule en début de la deuxième.

Dans l'exemple suivant, la différence est infime, mais différence réelle il y a, vous l'avez trouvée ?

( = "ceci est une chaine de caractères" "ceci est une chaîne de caractères" ) renvoie nil à juste titre.

Si on peut comparer des réels et des entiers : ( = 1 1.0 ) renvoie T, c'est parfait
On ne peut pas comparer un entier ou un réel avec une chaîne de caractères, ( = 1 "1" ) renvoie nil

Dans les opérations de test d'égalité, il faut composer avec les faiblesses connues des systèmes informatiques dans la gestion des nombres et en particulier de la notion de virgule flottante, non ce n'est pas une virgule oubliée dans une mare, c'est une façon de coder les nombres.

Par exemple, si vous voulez vérifier que 1.0 retranché de 1.1 est égal à 0.10, ce qui est vrai arithmétiquement, malheureusement Autolisp vous renseignera faussement, vérifiez par vous-même  :

Question : Est-ce que 1.1 moins 1.0 égale 0.10 ? en code ça s'écrit : ( = ( - 1.1 1.0 ) 0.10 ) et la réponse dans ce cas précis est nil, autrement dit le logiciel estime qu'il n'est pas vrai que 1.10 moins 1.0 est égal à 0.10.

Pour pallier ce souci d'imprécision numérique, je vous invite à regarder la fonction (equal) qui propose une option intéressante.

Exemples avec des listes : Définition des variables a b et c : a : est la liste ( 1 2 3), b : prend la valeur de a, c : est la liste (1 2 3)

( setq a ' ( 1 2 3 ))

( setq b a )

( setq c ' ( 1 2 3 ))

Comparons :
( = a b ) renvoie T
( = a c ) renvoie nil
( = b c ) renvoie nil.

Ce n'est pas toujours simple de tester une égalité, la preuve ! Les trois variables a b et c contiennent toutes les trois ( 1 2 3 ) et quelquefois Autolisp renvoie nil. Faites consciencieusement des tests.



2 juin 2017
mise à jour le 15 décembre 2017
mise à jour le 30 mai 2023