L'opérateur and est utilisé pour réaliser l'opération logique «ET».
Sa forme courante est la suivante:
(and <objet> <arg1> [ … <argN>])
L'opérateur and peut recevoir autant d'arguments que nécessaire.
(display (and (true) (true))) (display (and (true) (true) (false)))
⇒
(true) (false)
Si au cours de la combinaison des arguments (de gauche à droite), le résultat obtenu est «faux», on peut éviter d'évaluer les arguments supplémentaires en profitant de la forme à évaluation paresseuse.
(and <objet> {<arg1>} [ … {<argN>}])
Grace à cette forme, l'évaluation s'arrête lorsqu'un résultat «faux» est trouvé 1). Les expressions paresseuses sont évaluées jusqu'au moment où il n'est plus nécessaire de continuer l'évaluation parce que le résultat sera «faux».
(display (and (true) {(display "A")(true)} {(display "B")(false)} {(display "C")(true)} ) )
⇒
A B (false)
Dans l'exemple ci-dessus, l'évaluation s'arrête lorsque la combinaison logique «ET» parvient à un résultat «faux». On voit “A” et “B” dans la console, mais l'expression qui permettrait d'afficher la lettre “C” n'est pas évaluée.
Le contenu des expressions paresseuses est évalué de gauche à droite uniquement tant qu'on n'est pas fixé sur le résultat final. Si le résultat de l'évaluation intermédiaire des arguments correspond à un résultat «faux», il n'est plus nécessaire de poursuivre le calcul. Les expressions suivantes ne sont donc pas évaluées.
Toutefois, il faut noter que l'opérateur and est un opérateur générique. On l'utilise souvent avec des valeurs booléennes, mais on peut aussi l'utiliser avec les nombres entiers (int et long-int - Dans ce cas, les opérations sont réalisées de façon binaire, c-à-d, bit à bit). On peut aussi l'appliquer sur d'autres types d'objets qui l'implémente. Bien sûr, la sémantique de l'opérateur dépendra alors de l'objet et de son implémentation.
(display (bin-string (and 0b1011 0b1010))
⇒
1010
Il est possible de définir le comportement spécifique de l'opérateur et d'élargir son concept à tous nouveau type de donnée. Pour cela, il suffit de définir ou de surcharger la méthode @and.
|
![]() |
|
||||||||