1 00:00:00,200 --> 00:00:01,590 Dans cette séquence, je vous présente les blocks. 2 00:00:02,770 --> 00:00:05,230 Les blocks sont des sortes de méthodes anonymes aussi 3 00:00:05,430 --> 00:00:06,740 appelées des fermetures lexicales. 4 00:00:07,310 --> 00:00:08,410 Elles sont partout dans Pharo. 5 00:00:08,910 --> 00:00:11,320 Elles constituent la base pour les boucles, les 6 00:00:11,520 --> 00:00:13,060 conditionnels, les itérateurs et même les traitements 7 00:00:13,260 --> 00:00:14,520 graphiques, voire les langages dédiés. 8 00:00:14,920 --> 00:00:17,400 En fait, elles sont au cœur du système, comme nous le verrons. 9 00:00:17,600 --> 00:00:19,120 Pour la petite anecdote, elles ont seulement été 10 00:00:19,320 --> 00:00:21,190 introduites dans la dernière version de Java. 11 00:00:23,210 --> 00:00:27,310 Pour définir un block, on va utiliser en fait des crochets, syntaxiquement. 12 00:00:27,580 --> 00:00:30,740 Ici, vous avez un exemple, on a un crochet ouvrant, un 13 00:00:30,940 --> 00:00:32,760 ensemble d'expressions et puis un crochet fermant. 14 00:00:35,180 --> 00:00:37,700 On va parler de définition d'un block. 15 00:00:38,760 --> 00:00:40,240 Je vais vous prendre un autre exemple. 16 00:00:40,440 --> 00:00:42,480 Ici, on a une expression : 1/0. 17 00:00:43,210 --> 00:00:46,750 Si on exécute cette expression, on voit qu'elle retourne bien une erreur. 18 00:00:48,940 --> 00:00:51,370 On encapsule cette expression dans un block, ici, je 19 00:00:51,570 --> 00:00:53,850 définis un block qui contient l'expression 1/0. 20 00:00:55,270 --> 00:00:58,340 Si j'évalue la définition de ce block, en fait, il ne se 21 00:00:58,540 --> 00:00:59,870 passe rien, donc je n'ai pas d'erreur. 22 00:01:00,290 --> 00:01:03,230 J'ai le block qui m'est retourné, parce qu'en fait la 23 00:01:03,430 --> 00:01:06,000 définition d'un block n'exécute pas les expressions qu'il contient. 24 00:01:07,860 --> 00:01:11,620 Donc ici, on peut définir autant de blocks qu'on veut, 25 00:01:11,820 --> 00:01:14,210 les expressions à l'intérieur sont comme figées. 26 00:01:15,670 --> 00:01:19,200 Pour évaluer les expressions qu'un block contient, il 27 00:01:19,400 --> 00:01:21,620 faut le faire explicitement en lui envoyant le message value. 28 00:01:22,120 --> 00:01:25,030 On a un exemple ici, on a un block 2+6, et puis on lui 29 00:01:25,230 --> 00:01:28,660 envoie le message value. Cette fois-ci, les expressions à 30 00:01:28,860 --> 00:01:33,290 l'intérieur vont être évaluées et on va nous rendre le résultat: 8. 31 00:01:34,640 --> 00:01:36,650 Par contre, si l'une des expressions à l'intérieur du 32 00:01:36,850 --> 00:01:39,450 block contient une erreur, évidemment l'erreur va être 33 00:01:39,650 --> 00:01:40,940 retournée au moment de l'évaluation du block. 34 00:01:41,320 --> 00:01:42,660 C'est l'exemple numéro 2 ici. 35 00:01:42,860 --> 00:01:46,780 Si 1 est divisé par 0, j'envoie le message value au block 36 00:01:47,000 --> 00:01:50,170 et on a bien une erreur qui est retournée. 37 00:01:50,370 --> 00:01:52,490 Les blocks en fait peuvent aussi avoir des arguments, 38 00:01:53,370 --> 00:01:56,120 donc là c'est le cas dans cet exemple comme pour les méthodes. 39 00:01:56,730 --> 00:02:00,750 Le block est défini, il est toujours ouvert par un 40 00:02:00,950 --> 00:02:03,570 crochet ouvrant et fermé par un crochet fermant. 41 00:02:03,770 --> 00:02:07,680 On a l'ensemble des arguments qui sont ici préfixés par des deux points. 42 00:02:08,730 --> 00:02:12,360 Et puis ensuite, on a une barre verticale, donc un |, qui 43 00:02:12,560 --> 00:02:15,250 permet de séparer la partie déclaration des arguments de 44 00:02:15,450 --> 00:02:18,010 la partie corps du block, donc l'ensemble des expressions qu'il contient. 45 00:02:18,720 --> 00:02:22,780 L'argument s'appelle x dans cet exemple et puis x+2, c'est 46 00:02:23,000 --> 00:02:24,300 la seule expression que contient le block. 47 00:02:24,700 --> 00:02:27,080 Si j'envoie le message value au block. 48 00:02:27,470 --> 00:02:29,770 Ici, il faut utiliser un message particulier donc c'est 49 00:02:30,000 --> 00:02:32,250 value: avec un paramètre, puisqu'on va lui passer en même 50 00:02:32,450 --> 00:02:36,120 temps la valeur 5 qui va se substituer à l'argument x au 51 00:02:36,320 --> 00:02:38,070 moment de l'évaluation des expressions dans le block. 52 00:02:39,070 --> 00:02:43,380 Si ce block, je lui envoie le message value: 5, on va 53 00:02:43,580 --> 00:02:47,240 bien avoir le résultat 7 puisque x vaudra 5 pendant l'évaluation 54 00:02:47,440 --> 00:02:49,060 de ce block. 55 00:02:49,260 --> 00:02:51,420 Ça, c'est l'exemple que j'ai montré juste avant sauf que 56 00:02:51,620 --> 00:02:55,270 dans ce nouvel exemple, on a plusieurs expressions dans le block. 57 00:02:55,540 --> 00:02:58,630 Ici, j'en ai 2, donc x + 33 et x + 2. 58 00:02:59,000 --> 00:03:02,120 Sauf que quand j'envoie le message value: 5 pour évaluer 59 00:03:02,320 --> 00:03:06,370 les expressions de ce block, en fait ce qui va être 60 00:03:06,570 --> 00:03:10,450 retourné par l'évaluation, c'est uniquement la valeur de 61 00:03:10,650 --> 00:03:11,900 la dernière expression du block. 62 00:03:12,250 --> 00:03:15,910 Ici, c'est seulement le résultat de x + 2 qui va être 63 00:03:16,110 --> 00:03:20,000 retourné, donc 7. 64 00:03:20,190 --> 00:03:21,790 Les blocks sont des objets comme les autres en Pharo. 65 00:03:22,590 --> 00:03:24,400 Ils peuvent être sauvegardés dans des variables 66 00:03:24,600 --> 00:03:26,700 temporaires et puis on peut leur envoyer des messages 67 00:03:26,900 --> 00:03:29,550 comme pour des objets classiques. Donc là, c'est l'exemple 68 00:03:29,750 --> 00:03:30,620 que je vous montre ici. 69 00:03:31,600 --> 00:03:35,930 On peut stocker la définition de ce block x + 2 dans une 70 00:03:36,130 --> 00:03:38,290 variable qui s'appelle add2 et puis ensuite, on va lui 71 00:03:38,490 --> 00:03:40,640 envoyer des messages pour évaluer plusieurs fois ce block. 72 00:03:40,900 --> 00:03:42,710 Je vais lui envoyer une première fois le message value: 73 00:03:43,240 --> 00:03:46,630 en lui disant de s'évaluer avec la valeur 5, donc ça va nous rendre 7. 74 00:03:46,830 --> 00:03:48,640 Et puis une deuxième fois, le message value: avec la 75 00:03:48,840 --> 00:03:51,210 valeur 33 où ça va nous rendre la valeur 35. 76 00:03:52,600 --> 00:03:55,810 On peut aussi définir des blocks avec plusieurs arguments. 77 00:03:56,330 --> 00:03:59,120 Ici, je vous donne un exemple avec x et y, donc il y a 78 00:03:59,320 --> 00:04:00,510 deux arguments pour ce block. 79 00:04:01,060 --> 00:04:03,120 Par contre, comment est-ce qu'on pourrait faire pour 80 00:04:03,500 --> 00:04:06,750 évaluer ce block, puisqu'il faudrait maintenant passer 81 00:04:06,950 --> 00:04:11,430 deux valeurs pour déclencher l'évaluation, à la fois 5 et 82 00:04:11,630 --> 00:04:14,180 7 qui viendraient se substituer à x et y? 83 00:04:14,410 --> 00:04:17,400 La réponse, c'est qu'en fait on va utiliser le message 84 00:04:17,690 --> 00:04:22,330 value: value: qui est une méthode de la classe 85 00:04:22,530 --> 00:04:27,460 block. 5 va bien se substituer à x et 7 va se substituer 86 00:04:27,660 --> 00:04:29,660 à y et on aura bien le résultat 12. 87 00:04:33,110 --> 00:04:35,670 Comme pour les méthodes, un block peut aussi avoir des 88 00:04:35,870 --> 00:04:38,530 variables temporaires. Ici, je vous donne un exemple, 89 00:04:38,880 --> 00:04:40,840 mais cette fois, c'est un exemple en conditions réelles 90 00:04:41,040 --> 00:04:42,680 puisqu'il est extrait de la classe Collection. 91 00:04:43,810 --> 00:04:47,740 Le block commence ici et se termine ici. 92 00:04:49,400 --> 00:04:52,840 Ce block a un argument qui s'appelle index. 93 00:04:53,700 --> 00:04:56,570 Et puis, il a une variable temporaire définie entre deux 94 00:04:56,770 --> 00:04:58,840 barres obliques ici, qui s'appelle args. 95 00:04:59,950 --> 00:05:04,630 Cette variable temporaire args n'existe que 96 00:05:04,830 --> 00:05:07,100 pendant l'évaluation des expressions du block. 97 00:05:10,300 --> 00:05:12,020 Les blocks sont définis dans des méthodes. 98 00:05:12,220 --> 00:05:15,380 Donc dans un block, on peut aussi utiliser le return. 99 00:05:16,780 --> 00:05:21,200 Je vous donne un exemple ici issu de la classe Integer, c'est 100 00:05:21,400 --> 00:05:23,000 la méthode qui s'appelle factorielle. 101 00:05:24,330 --> 00:05:27,810 On a plusieurs blocks dans cette méthode: un ici, un ici. 102 00:05:28,250 --> 00:05:32,280 Et puis ces blocks contiennent des return, c'est le symbole qui est ici. 103 00:05:32,550 --> 00:05:35,910 Le return va permettre de sortir de la méthode factorielle dans cet exemple. 104 00:05:36,140 --> 00:05:38,940 Par exemple, si j'envoie le message factoriel 0, j'obtiens 105 00:05:40,190 --> 00:05:45,060 bien la réponse 1 et j'obtiens 1 en fait grâce au return 106 00:05:45,260 --> 00:05:47,530 qui est ici le premier return dans le block qui permet de 107 00:05:47,730 --> 00:05:49,580 faire sortir de la méthode factorielle. 108 00:05:49,890 --> 00:05:52,780 Le return dans un block permet de sortir de la méthode 109 00:05:53,250 --> 00:05:54,790 qui contient la définition du block. 110 00:05:56,960 --> 00:05:59,720 Un petit conseil quand vous utilisez des blocks. 111 00:05:59,920 --> 00:06:02,360 Les blocks sont des éléments extrêmement puissants. 112 00:06:02,580 --> 00:06:04,660 Il faut les utiliser avec parcimonie. 113 00:06:04,860 --> 00:06:08,640 Il ne faut pas aller au-delà de deux à trois arguments sur un block. 114 00:06:08,840 --> 00:06:10,330 Si on va plus loin, ça devient vite incompréhensible. 115 00:06:11,630 --> 00:06:14,700 Il vaut mieux définir une classe avec des variables d'instances 116 00:06:14,900 --> 00:06:16,880 et des méthodes où ça sera beaucoup plus lisible. 117 00:06:18,320 --> 00:06:22,000 En résumé, dans cette séquence, on a vu les blocks, on a vu leur syntaxe. 118 00:06:22,960 --> 00:06:26,280 On a vu que c'étaient des sortes de méthodes anonymes, c'est-à-dire 119 00:06:26,490 --> 00:06:27,870 des fermetures lexicales. 120 00:06:28,100 --> 00:06:30,250 On peut stocker les blocks dans des variables, c'est des 121 00:06:30,450 --> 00:06:31,620 objets comme les autres en Pharo. 122 00:06:31,820 --> 00:06:34,950 On verra dans les prochaines séquences que les blocks 123 00:06:35,150 --> 00:06:37,860 sont à la base d'énormément de constructions en Pharo: 124 00:06:38,060 --> 00:06:39,620 les boucles, les itérations, etc.