Bonjour. Dans ce cours, on va revenir sur l'implémentation
d’ifTrue:ifFalse:.
Pour ceux d'entre vous qui sont attentifs et je sais qu'il
y en a plein, vous avez sûrement remarqué que, quand j'ai
proposé les exemples pour l'implémentation de Not, j'avais
dit qu'il y avait Not, qu'on pouvait implémenter Not, Or et ifTrue:ifFalse:.
Et dans la solution, je n'ai jamais parlé d’ifTrue:ifFalse:.
On va résoudre ce problème maintenant.
Effectivement, les conditions sont des messages dans Pharo.
Là, je vous ai montré un exemple.
J'ai une classe temps, il y a Weather isRaining.
Donc, si jamais il pleut, si c'est vrai, je vais
prendre mon parapluie et sinon je vais mettre mes lunettes de soleil.
Et ifTrue:ifFalse:, maintenant vous voyez bien qu'il y a
les deux petits points, ça veut dire que ce sont des messages à mots-clés.
C'est un message à mots-clés, donc le message
ifTrue:ifFalse: est un message à mots-clés, il est envoyé
à une instance de booléen. Bien sûr, il est vraiment très
optimisé par le compilateur.
En fait, il n'est pas envoyé, mais conceptuellement, il l'est.
Si vous voulez redéfinir la méthode SiAlors:Sinon: dans
Pharo, vous pouvez le faire de la même manière que la
technique je vais vous expliquer.
Il se trouve qu'on a tellement besoin de cette méthode
ifTrue:ifFalse:, on veut qu'elle aille absolument
hyper-vite, qu'elle n'ait pas invoqué le compilateur
Ligne Line et fait des jumps à la place.
Pour le cours, on va voir comment ça fonctionne.
Ce que je vais vous demander, c'est proposer une
implémentation, maintenant que vous connaissez les
blocks, vous connaissez ce qu'on a fait sur true et
false, avec Or et Not.
Vous pouvez le faire sur ifTrue:ifFalse:.
En gros, si j'ai un receveur ifFalse:, qu'est-ce que je vais rendre?
Je vais rendre 5. Si mon receveur est vrai, je vais rendre 3.
Et encore une fois, on a que des objets, des messages et
des block, ça devient un peu lassant, mais c'est comme ça.
Vous vous rappelez que des crochets
gèlent l'exécution de l'expression qu'ils contiennent
et que le message value va forcer l'exécution du code gelé.
Avec ça, plus Not et Or, vous devez savoir implémenter
les conditions et vous devriez être capables d'implémenter
siAlors:sinon: de la même manière.
Je vous laisse deux secondes pour réfléchir.
Comment c'est implémenté ?
C'est implémenté exactement de la même manière qu’Or ou Not.
Dans la classe true, j'ai une méthode qui s'appelle
ifTrue:ifFalse:; avec deux arguments, un Block pour le
true, un Block pour le faux et qu'est-ce que je fais.
Quand je suis dans la classe true, je vais exécuter le Block true.
De la même manière, quand je suis dans la classe false,
je vais avoir la même méthode avec les deux mêmes arguments.
Mais là, vu que je suis dans la classe false, je vais
exécuter le Block faux. Et du coup, j'ai l'implémentation des booléens.
Comment ça marche ?
Comme ça. Ça veut dire que là, quand je suis en train d'envoyer
le message à mon booléen qui est true, je lui envoie
ifTrue, do quelque chose et do quelque chose false.
Je vais chercher la méthode ifTrue:ifFalse: dans la classe true.
C'est celle-là. Il me dit d'exécuter le Block true.
Je vais exécuter le Block true.
Maintenant, j'envoie un message b est un booléen false.
J'envoie le message, je cherche ici, je trouve
ifTrue:ifFalse:, là, je dois exécuter le Bock qui est
passé qui est le Block false, donc je vais faire le Block false.
Vous ne pourrez pas tester en mettant un breakpoint dans
ifTrue:ifFalse: parce que c'est optimisé et puis le
système ne le supportera pas, mais par contre, ce que
vous pouvez très bien faire, je vous suggère d'implémenter
de la même manière sinon: ou Si:Alors:, donc Si:Alors:
unBlock, sinon: unBlock2 et
de l'implémenter. Vous pouvez mettre un breakpoint dedans et expérimenter.
Finalement, qu'est-ce qu'on a vu, qu'est-ce que c'était
encore que cet exemple ?
On a vu qu'envoyer un message sélectionne la bonne
méthode, comme d'habitude. Là, on a choisi de laisser le
receveur décider par lui-même quel était le comportement
qu'il devait avoir et on a vu à l'œuvre le fait que les
crochets pouvaient "freezer" l'exécution et que value
allait forcer l'exécution d'un morceau de code.