![]()
![]()
![]()
![]()
![]()
Next: Fonctions anonymes Up: Fonction Previous: Opérations sur les listes   Contents   Index
EgalitéL'égalité peut sembler de prime abord une question simple : deux choses sont égales ou pas. En réalité, il faut s'entendre sur ce que l'on compare.
Quittons un instant Scheme pour C. Que signifie en C la comparaison de deux chaînes de caractères ? S'agit-il simplement de comparer la valeur de deux pointeurs ou d'appeler une fonction strcmp ? Si nous optons pour l'appel à la fonction, appelons-nous strcmp ou strcasecmp qui ne tient pas compte des majuscules minuscules ?
On retrouve cette multiplicité en Scheme. On a par exemple char=?, char-ci=?, string=?, string-ci=?. La fonction char=? compare deux caractères et retournent #t s'ils sont identiques. Le lecteur se réfèrera au Revised 4 Report on the Algorithmic Language Scheme pour connaître les autres fonctions de comparaison.
Scheme définit aussi trois autres fonctions de comparaisons à usage général. Ce sont eq?, eqv? et equal?. Elles permettent de comparer n'importe quel objet Scheme sans provoquer d'erreur si leur type est différent.
La fonction eq? compare deux objets. Elle retourne vrai si les objets comparés sont immuables et identiques (liste vide, booléens, caractères et entiers) ou s'ils sont physiquement identiques (ils occupent le même emplacement mémoire). Par exemple :
Osm> (eq? 1 1) => #t Osm> (eq? 1.2 1.2) => #f Osm> (eq? "chaîne" "chaîne") ; Les chaînes sont physiquement ; différentes => #f Osm> (define x "chaîne") => #unspecified Osm> (eq? x x) ; x est évalué en "chaîne". Les objets ; comparés sont donc identiques. => #tLa fonction eqv? est une extension de la fonction eq? dans le sens où elle considère immuables les réels et les chaînes de caractères. On aura :
Osm> (eqv? 1.2 1.2) => #t Osm> (eqv? "chaîne" "chaîne") => #t Osm> (define x (list 1 2 3)) => #unspecified Osm> (eqv? x x) => #fOn notera que si deux objets sont égaux par eq?, ils le sont par eqv?.
Enfin, la fonction equal? permet de comparer les objets composites que sont les paires et les vecteurs. Par exemple, deux vecteurs sont égaux par equal? si toutes leurs composantes sont égales deux à deux par equal?. On a :
Osm> (define x (list 1 2 3)) => #unspecified Osm> (equal? x x) => #tOn notera que si deux objets sont égaux par evq?, ils le sont par equal?.
L'usage de equal? peut être dangereux si les structures sont récursives. Par exemple :
Osm> (define x (list 1 2)) => #unspecified Osm> (set-car! x x) => #unspecified Osm> (equal? x x) ; ne se termine jamaisEn règle générale, la fonction eq? est la plus utilisée. D'une part elle ne présente pas le même danger que equal? et elle est souvent la plus efficace que eqv?.
La comparaison des nombres se fait soit à l'aide de =? si l'on teste plus de deux nombres, soit avec eq? si l'on teste deux nombres.
![]()
![]()
![]()
![]()
![]()
Next: Fonctions anonymes Up: Fonction Previous: Opérations sur les listes   Contents   Index © 1993 to 2001 Erian Concept