1 00:00:00,750 --> 00:00:04,380 Dans cette séquence, nous allons parler des boucles dans Pharo. 2 00:00:04,580 --> 00:00:07,590 Les boucles sont des messages qu'on va envoyer à des objets. 3 00:00:07,790 --> 00:00:10,670 En fait, il existe plein de types de boucles différents. 4 00:00:12,050 --> 00:00:14,290 C'est des messages qu'on va envoyer soit à des nombres, à 5 00:00:14,490 --> 00:00:17,650 des collections, voire même à des blocks et ça sera dans 6 00:00:17,850 --> 00:00:19,950 certains cas des messages d'itération sur les éléments d'une 7 00:00:20,150 --> 00:00:21,140 collection, par exemple. 8 00:00:22,420 --> 00:00:26,570 Voilà un exemple, on envoie le message timesRepeat 9 00:00:27,540 --> 00:00:31,370 à l'entier 4 et on va lui passer en paramètre un block. 10 00:00:31,840 --> 00:00:34,460 Si vous vous rappelez, on a vu les blocks dans la séquence précédente. 11 00:00:35,040 --> 00:00:38,440 On a un block qui commence ici et qui se termine ici. 12 00:00:39,550 --> 00:00:43,190 Ce message va permettre de répéter l'évaluation de ce 13 00:00:43,390 --> 00:00:46,480 block plusieurs fois, en l'occurrence quatre fois dans 14 00:00:46,680 --> 00:00:48,620 cet exemple puisque le receveur du message, c'était 4. 15 00:00:51,000 --> 00:00:54,140 Il existe d'autres types de messages pour effectuer des boucles. 16 00:00:54,360 --> 00:00:57,600 Par exemple ici dans cet exemple, c'est le message to: do:. 17 00:00:57,800 --> 00:00:59,840 Le message to:do est défini sur la classe number. 18 00:01:01,490 --> 00:01:04,540 Et puis, on va lui passer également en paramètre un block 19 00:01:04,760 --> 00:01:07,740 qui est le dernier argument du message et ce block va 20 00:01:07,940 --> 00:01:10,720 être exécuté un certain nombre de fois avec un curseur de 21 00:01:10,920 --> 00:01:14,710 boucle qui varie depuis le receveur jusqu'au premier 22 00:01:14,910 --> 00:01:16,220 argument du message. 23 00:01:18,030 --> 00:01:21,150 On a un exemple ici, si on reprend exactement le même 24 00:01:21,350 --> 00:01:26,120 exemple, on va envoyer le message to:do à l' 25 00:01:26,320 --> 00:01:31,000 entier 1. Dans le block, on va afficher le 26 00:01:31,200 --> 00:01:33,500 paramètre du block, le paramètre i à chaque tour de boucle. 27 00:01:34,580 --> 00:01:36,510 On voit que dans le Transcript, on a bien tous les 28 00:01:36,710 --> 00:01:39,160 entiers qui ont été affichés entre 1 et 100. 29 00:01:43,280 --> 00:01:46,660 Il existe d'autres messages pour effectuer des boucles. 30 00:01:47,570 --> 00:01:50,960 Par exemple, on a le message to:by:do: pour faire des 31 00:01:51,160 --> 00:01:52,330 incréments de plus que par 1. 32 00:01:52,600 --> 00:01:55,070 On fait des incréments ici pour contrôler de combien on 33 00:01:55,270 --> 00:01:57,850 fait l'incrément, on peut faire des incréments par 3 ici dans cet exemple. 34 00:01:58,260 --> 00:02:02,210 À chaque tour de boucle, i va prendre des valeurs de 3 en 3. 35 00:02:04,280 --> 00:02:07,480 On voit l'exemple ici, cette fois quand on a exécuté ce 36 00:02:07,680 --> 00:02:11,820 morceau de code, on voit bien que i a bien varié de 1 à 37 00:02:12,020 --> 00:02:14,190 100, mais avec un incrément de 3 à chaque fois. 38 00:02:16,050 --> 00:02:19,020 Il existe maintenant aussi des itérateurs pour effectuer des boucles. 39 00:02:19,220 --> 00:02:24,100 Les itérateurs sont des messages plutôt à envoyer à des 40 00:02:24,300 --> 00:02:26,730 objets Collection. Il en existe de toutes sortes. 41 00:02:27,190 --> 00:02:30,670 On a par exemple do: qui permet d'itérer sur chacun des 42 00:02:30,870 --> 00:02:33,770 éléments d'une collection. Collect: qui permet à la fois 43 00:02:34,000 --> 00:02:35,790 d'itérer sur les éléments d'une collection, mais 44 00:02:36,000 --> 00:02:39,450 également de récupérer, de collecter les résultats pour 45 00:02:39,650 --> 00:02:40,760 les mettre dans une nouvelle collection. 46 00:02:41,150 --> 00:02:44,490 Select: qui permet de sélectionner un ensemble d'éléments 47 00:02:44,690 --> 00:02:46,070 à l'intérieur d'une collection, donc de construire une 48 00:02:46,270 --> 00:02:48,470 nouvelle collection uniquement avec ceux qu'on aurait sectionnés. 49 00:02:48,940 --> 00:02:51,930 Reject: qui permet d'éliminer les éléments qu'on ne 50 00:02:52,130 --> 00:02:54,710 voudrait pas dans une collection. Detect: qui permet de 51 00:02:56,080 --> 00:02:59,030 savoir si un élément existe dans une collection donnée. 52 00:03:00,600 --> 00:03:03,070 On va en voir quelques-uns dans la suite de ces slides. 53 00:03:04,490 --> 00:03:07,020 Par exemple, do: qui est finalement le message le plus 54 00:03:07,220 --> 00:03:10,920 courant qu'on utilise. On va envoyer le message do: à une 55 00:03:11,120 --> 00:03:12,830 collection et on va lui passer un block. 56 00:03:13,400 --> 00:03:18,120 À chaque tour de boucle, le block, le paramètre du block, 57 00:03:18,320 --> 00:03:21,870 ici each: va recevoir d'abord le premier élément de la 58 00:03:22,070 --> 00:03:25,640 collection, ensuite le second, jusqu'au dernier élément de la collection. 59 00:03:28,650 --> 00:03:31,810 Voici un exemple, ici on a une collection qui est définie. 60 00:03:32,010 --> 00:03:34,100 Je vous rappelle que la syntaxe, c'est dièse, parenthèse 61 00:03:34,360 --> 00:03:37,060 et puis on termine par une parenthèse pour les collections littérales. 62 00:03:37,690 --> 00:03:42,520 Cette collection contient quatre entiers: 15, 10, 19, 68. 63 00:03:42,720 --> 00:03:46,030 On envoie le message do: à cette collection, on lui passe un block. 64 00:03:46,580 --> 00:03:51,440 I, qui est le paramètre du block, va 65 00:03:51,640 --> 00:03:55,840 prendre au premier tour de boucle la valeur 15 ensuite 10, 19 et 68. 66 00:03:59,270 --> 00:04:02,700 Voici un autre message qui est whileTrue: qui permet 67 00:04:02,900 --> 00:04:04,210 également d'effectuer des boucles. 68 00:04:04,410 --> 00:04:07,770 whileTrue:, c'est un message qu'on va envoyer à un block, 69 00:04:08,000 --> 00:04:09,470 donc c'est un message défini sur la classe block. 70 00:04:10,360 --> 00:04:13,320 On a le block receveur qui est ici et puis on a un block 71 00:04:13,520 --> 00:04:15,630 d'argument qui est ici. 72 00:04:16,260 --> 00:04:19,430 Je vous donne un exemple concret issu de la classe Color. 73 00:04:19,910 --> 00:04:21,660 On a ici un whileTrue:. 74 00:04:22,940 --> 00:04:24,120 On a le block receveur. 75 00:04:24,320 --> 00:04:26,600 Dans le block receveur, on a une condition: ce block va 76 00:04:26,800 --> 00:04:29,250 s'évaluer à une condition, true ou false. 77 00:04:29,450 --> 00:04:31,600 En fonction de l'évaluation de ce premier block, le 78 00:04:31,800 --> 00:04:35,360 receveur, on va déclencher l'exécution ou pas du block 79 00:04:35,560 --> 00:04:39,800 argument qui est le deuxième block, le paramètre de la méthode whileTrue:. 80 00:04:40,000 --> 00:04:41,280 Il existe une variation de whileTrue 81 00:04:45,510 --> 00:04:50,170 sans paramètres qui prend le block receveur, qui l'évalue 82 00:04:50,620 --> 00:04:54,030 et si ce block s'évalue à vrai ou à faux, il est réévalué 83 00:04:54,230 --> 00:04:57,180 une fois supplémentaire. En fait, on va réévaluer le 84 00:04:57,380 --> 00:04:59,020 block tant qu'il s'évalue à vrai. 85 00:05:00,820 --> 00:05:03,710 On a exactement les pendants de whileTrue: avec les 86 00:05:03,910 --> 00:05:07,360 méthodes de whileFalse sans paramètres et avec paramètres. 87 00:05:08,190 --> 00:05:11,180 Toutes les variations existent en fait dans les classes 88 00:05:11,380 --> 00:05:14,610 sur les blocks. 89 00:05:14,810 --> 00:05:18,000 En résumé, sur cette séquence, on a vu que les boucles en 90 00:05:18,200 --> 00:05:21,780 Pharo sont exprimées comme des messages normaux envoyés à 91 00:05:22,000 --> 00:05:26,270 des objets, que ce soit des entiers, des collections, des blocks. 92 00:05:29,620 --> 00:05:32,100 Avec ça, on peut construire énormément de boucles 93 00:05:32,300 --> 00:05:34,470 différentes et même en rajouter si on en a envie.