Probablement dans tous les langages, le "ou" est implémenté de manière "paresseuse" (lazy) et n'évalue la partie droite que si la partie gauche est fausse, et certains (de mémoire) ont un opérateur spécial qui n'est pas paresseux.
Il faut bien comprendre que l'évaluation de la partie droite du "ou" logique n'est pas nécessaire au calcul de la valeur de vérité de la branche if, si la partie gauche est déjà vraie. Alors pourquoi le langage la ferait-elle ? Ce n'est ni normal ni logique. Il n'y a pas besoin de précision particulière dans la documentation de PHP pour cela.
On s'est trop éloigné de la programmation fonctionnelle pour avoir une compréhension intuitive du phénomène ici, qui devient un "problème". On se permet d'utiliser un prédicat qui aura en outre un effet de bord et on est triste que l'effet de bord ne soit pas obtenu alors que le prédicat n'était pas nécessaire au calcul du résultat de la valeur de vérité de la branche.
Le seul point de documentation qui pourrait être donné, c'est de savoir si c'est d'abord l'opérande gauche du "ou" ou l'opérande droite qui doit être évalué. Je me disais que j'avais vaguement souvenance que ocaml ou haskell évalue de droite à gauche mais ce n'est pas le cas pour ocaml en tous cas :
# let va = ref true;;
val va : bool ref = {contents = true}
# let preda () = print_string "in preda\n"; !va = true;;
val preda : unit -> bool = <fun>
# let predb () = print_string "in predb\n"; !va = true;;
val predb : unit -> bool = <fun>
# let _ = if (preda () or predb ()) then "yo" else "flute";;
in preda
- : string = "yo"
Je suis trop nul en haskell pour tester ce langage par contre...
[^] # Re: Normal
Posté par gc . En réponse au message Fonctionnement du OR. Évalué à 2.
Il faut bien comprendre que l'évaluation de la partie droite du "ou" logique n'est pas nécessaire au calcul de la valeur de vérité de la branche if, si la partie gauche est déjà vraie. Alors pourquoi le langage la ferait-elle ? Ce n'est ni normal ni logique. Il n'y a pas besoin de précision particulière dans la documentation de PHP pour cela.
On s'est trop éloigné de la programmation fonctionnelle pour avoir une compréhension intuitive du phénomène ici, qui devient un "problème". On se permet d'utiliser un prédicat qui aura en outre un effet de bord et on est triste que l'effet de bord ne soit pas obtenu alors que le prédicat n'était pas nécessaire au calcul du résultat de la valeur de vérité de la branche.
Le seul point de documentation qui pourrait être donné, c'est de savoir si c'est d'abord l'opérande gauche du "ou" ou l'opérande droite qui doit être évalué. Je me disais que j'avais vaguement souvenance que ocaml ou haskell évalue de droite à gauche mais ce n'est pas le cas pour ocaml en tous cas :
# let va = ref true;;
val va : bool ref = {contents = true}
# let preda () = print_string "in preda\n"; !va = true;;
val preda : unit -> bool = <fun>
# let predb () = print_string "in predb\n"; !va = true;;
val predb : unit -> bool = <fun>
# let _ = if (preda () or predb ()) then "yo" else "flute";;
in preda
- : string = "yo"
Je suis trop nul en haskell pour tester ce langage par contre...