WEBVTT

00:00:00.200 --> 00:00:03.080 align:middle
Cette séance va être
consacrée à un survol de la syntaxe.

00:00:03.280 --> 00:00:05.200 align:middle
Donc, on va vous montrer
l'entièreté de la syntaxe.

00:00:06.460 --> 00:00:08.090 align:middle
Il ne faut pas que vous
vous stressiez par rapport à si

00:00:08.290 --> 00:00:09.520 align:middle
vous comprenez ou pas entièrement.

00:00:09.750 --> 00:00:11.350 align:middle
On reprendra tous
ces éléments plus tard.

00:00:11.550 --> 00:00:14.550 align:middle
Par contre, l'idée, c'était
de vous montrer l'ensemble de

00:00:14.750 --> 00:00:18.480 align:middle
ce qu'il y a dans Pharo.
On va voir les éléments

00:00:18.680 --> 00:00:20.140 align:middle
syntaxiques principaux.

00:00:20.490 --> 00:00:22.000 align:middle
On va voir qu’il y a
trois sortes de messages.

00:00:22.740 --> 00:00:25.780 align:middle
Et puis, on va voir la
syntaxe sur les blocks qui est un

00:00:26.000 --> 00:00:26.880 align:middle
élément essentiel de Pharo.

00:00:27.680 --> 00:00:29.450 align:middle
Ne stressez pas si vous
n'avez pas tout compris, on

00:00:29.650 --> 00:00:32.360 align:middle
reprendra chacun de ces points
dans des séquences ultérieures.

00:00:34.000 --> 00:00:37.560 align:middle
Juste pour le rappel, vous avez
toute la syntaxe sur ce transparent.

00:00:37.760 --> 00:00:39.320 align:middle
Là, par exemple, maintenant
je peux venir un petit peu

00:00:39.520 --> 00:00:41.930 align:middle
dans les détails, vous avez
une définition de méthode.

00:00:42.130 --> 00:00:43.520 align:middle
Là, je définis la
méthode exampleWithNumber.

00:00:43.720 --> 00:00:45.080 align:middle
Elle a un argument.

00:00:45.280 --> 00:00:48.620 align:middle
Par exemple, je vais avoir
des définitions locales de

00:00:48.820 --> 00:00:51.020 align:middle
variables avec les barres verticales.

00:00:51.310 --> 00:00:54.000 align:middle
J'ai le Return qui me
permet de rendre une valeur.

00:00:54.280 --> 00:00:57.460 align:middle
Je vais avoir des
boucles, une affectation.

00:00:57.670 --> 00:01:00.500 align:middle
Le point, par exemple ça va
être un séparateur d'instruction.

00:01:00.700 --> 00:01:04.220 align:middle
On va voir ce genre de

00:01:07.180 --> 00:01:07.940 align:middle
choses.

00:01:08.140 --> 00:01:08.950 align:middle
Commençons par le
traditionnel Hello World.

00:01:12.570 --> 00:01:15.000 align:middle
D'ailleurs, toutes les
expressions, vous pouvez les

00:01:15.200 --> 00:01:18.120 align:middle
exécuter dans Pharo vous-même
pour voir ce que donne le résultat.

00:01:18.600 --> 00:01:23.390 align:middle
Là, j'ai une chaîne que je convertis

00:01:23.700 --> 00:01:25.840 align:middle
dans une Morph, c'est
un élément graphique.

00:01:26.170 --> 00:01:28.960 align:middle
Je demande à cet élément
graphique de s'ouvrir dans une fenêtre.

00:01:30.270 --> 00:01:34.050 align:middle
J'ai envoyé message
asMorph à l'objet String et j'ai

00:01:34.250 --> 00:01:37.830 align:middle
envoyé le message
openInWindow à l'objet Morph résultant.

00:01:38.200 --> 00:01:41.460 align:middle
Donc là, on a eu deux envois
de messages et un objet String.

00:01:43.000 --> 00:01:45.100 align:middle
Un exemple plus compliqué,
imaginons que vous vouliez

00:01:45.300 --> 00:01:49.070 align:middle
prendre le logo Pharo qui
se trouve sur le web, on va

00:01:49.270 --> 00:01:50.610 align:middle
faire ça de la manière suivante.

00:01:51.080 --> 00:01:54.180 align:middle
On va faire ZnEasy getPng
avec une chaîne qui représente

00:01:54.520 --> 00:01:58.380 align:middle
l'url de la
ressource qu'on veut lire.

00:02:00.290 --> 00:02:03.890 align:middle
Et encore une fois, on va
la convertir en chaîne, en un

00:02:04.090 --> 00:02:06.430 align:middle
objet graphique et lui
demander de s'ouvrir dans une fenêtre.

00:02:07.000 --> 00:02:08.020 align:middle
Là, qu'est-ce qu'on voit ?

00:02:08.220 --> 00:02:10.120 align:middle
On voit que ZnEasy est une
 classe parce que les classes

00:02:10.320 --> 00:02:14.810 align:middle
commencent par une
majuscule. Le message getPng:

00:02:15.690 --> 00:02:17.940 align:middle
les deux points, ça veut dire
que je j'attends un argument.

00:02:18.140 --> 00:02:19.090 align:middle
Qu'est-ce que j'ai comme argument ?

00:02:19.430 --> 00:02:21.170 align:middle
J'ai la chaîne'http://pharo.

00:02:21.370 --> 00:02:25.420 align:middle
org', j'ai cette
chaîne-là qui est l'argument de la

00:02:25.620 --> 00:02:29.950 align:middle
méthode getPng. Donc, les messages

00:02:30.570 --> 00:02:34.660 align:middle
as Morph et openInWindow
sont lus de gauche à droite.

00:02:36.050 --> 00:02:38.060 align:middle
Encore une fois, vous
pouvez vraiment copier-coller ce

00:02:38.260 --> 00:02:41.750 align:middle
code, ou le retaper dans
Pharo, l'exécuter et vous allez

00:02:41.950 --> 00:02:42.800 align:middle
récupérer le logo Pharo.

00:02:44.250 --> 00:02:47.290 align:middle
Si on regarde ce qu'il y a
comme élément syntaxique dans

00:02:47.490 --> 00:02:50.030 align:middle
Pharo, vous avez les commentaires
qui commencent avec des doubles quotes.

00:02:50.230 --> 00:02:52.060 align:middle
Ça, c'est un commentaire.

00:02:52.430 --> 00:02:55.660 align:middle
Des caractères, les
caractères sont toujours avec dollar

00:02:55.860 --> 00:02:57.860 align:middle
quelque chose, $A,
c'est le caractère A.

00:02:58.340 --> 00:03:00.440 align:middle
Vous avez des chaînes,
les chaînes commencent et

00:03:00.640 --> 00:03:04.350 align:middle
finissent par une simple
quote. Vous avez des symboles,

00:03:04.550 --> 00:03:06.150 align:middle
les symboles ce sont
des chaînes uniques.

00:03:06.350 --> 00:03:10.110 align:middle
Souvent, ça commence comme
ça, un symbole avec le symbole

00:03:10.310 --> 00:03:12.280 align:middle
dièse, donc #A c'est le symbole A.

00:03:13.120 --> 00:03:14.800 align:middle
Vous avez aussi des
tableaux de littéraux.

00:03:15.000 --> 00:03:17.300 align:middle
Là, j'ai un tableau
avec 12, 23 et 36.

00:03:17.500 --> 00:03:18.860 align:middle
J'ai un tableau à trois éléments.

00:03:19.670 --> 00:03:21.700 align:middle
Après, vous avez les
entiers, ils ont plusieurs

00:03:21.900 --> 00:03:24.520 align:middle
représentations, mais dans ce
cours, on ne va pas s'appesantir dessus.

00:03:24.880 --> 00:03:27.620 align:middle
En général, on va utiliser
des représentations à base 10,

00:03:27.820 --> 00:03:30.040 align:middle
mais si vous voulez une
représentation à base 2, vous pouvez aussi.

00:03:30.460 --> 00:03:32.070 align:middle
Vous avez des réels, c'est pareil.

00:03:33.010 --> 00:03:35.010 align:middle
Si vous en avez besoin,
vous trouverez la syntaxe.

00:03:35.420 --> 00:03:37.370 align:middle
Vous avez les
booléens avec True ou False.

00:03:38.340 --> 00:03:41.130 align:middle
Vous avez la valeur
indéfinie, le nul de Java qui est le

00:03:41.330 --> 00:03:46.000 align:middle
nil en Pharo qui est instance
de la classe UndefinedObject.

00:03:46.160 --> 00:03:50.730 align:middle
Et vous avez les points, un
point, ça se décrit en Pharo

00:03:51.560 --> 00:03:56.460 align:middle
sous la forme de 10@200, par

00:03:56.660 --> 00:04:01.000 align:middle
exemple. Ça veut dire, je crée le
point 10 qui a X en 10 et 200 en Y.

00:04:03.820 --> 00:04:06.000 align:middle
Maintenant, on a vu à peu
près les éléments essentiels

00:04:06.200 --> 00:04:08.840 align:middle
pour l'aspect syntaxique. Vous
avez les constructeurs du langage.

00:04:09.040 --> 00:04:12.720 align:middle
Vous avez définition de
variable, définition de variable

00:04:12.920 --> 00:04:16.190 align:middle
temporaire, je vais mettre barre
verticale suivie d'une barre verticale.

00:04:16.440 --> 00:04:19.520 align:middle
L'affectation, c'est deux
points égal, ça c'est l'affectation,

00:04:19.720 --> 00:04:22.220 align:middle
je mets dans la
variable var la valeur Value.

00:04:22.830 --> 00:04:24.470 align:middle
J'ai des messages dans mon système.

00:04:24.820 --> 00:04:25.850 align:middle
Comment je les sépare ?

00:04:26.050 --> 00:04:30.340 align:middle
Je les sépare par des points quand
je veux avoir une séquence de message.

00:04:31.000 --> 00:04:33.850 align:middle
J'ai le retour, ça veut
dire, une fonction ou une méthode

00:04:34.050 --> 00:04:38.140 align:middle
va rendre une valeur, je
vais utiliser le chapeau qu'on

00:04:38.340 --> 00:04:39.110 align:middle
appelle caret en anglais.

00:04:39.780 --> 00:04:43.090 align:middle
Après, vous avez des
blocks qui sont, de manière

00:04:43.290 --> 00:04:47.480 align:middle
technique, des cultures
lexicales et qu'en première

00:04:47.680 --> 00:04:49.700 align:middle
instance, vous pouvez prendre
comme des méthodes anonymes.

00:04:50.400 --> 00:04:52.240 align:middle
Je vous montre ce qu'est un block.

00:04:52.520 --> 00:04:57.380 align:middle
Un block, ça se définit
avec des crochets et ça s'

00:04:57.580 --> 00:05:00.650 align:middle
exécute en utilisant le
message value, on va voir ça aussi.

00:05:01.780 --> 00:05:03.600 align:middle
Vous avez tous les
constructeurs du langage.

00:05:05.460 --> 00:05:08.390 align:middle
Si on regarde, qu'est-ce qu'un
 programme en Pharo, son essence?

00:05:08.800 --> 00:05:11.420 align:middle
C'est créer des objets,
qu'on a sûrement créés en

00:05:11.620 --> 00:05:14.000 align:middle
utilisant des messages,
envoyer des messages à ses objets

00:05:14.380 --> 00:05:16.950 align:middle
et, de temps en temps, utiliser
des blocks ou des méthodes anonymes.

00:05:17.540 --> 00:05:18.300 align:middle
C'est tout.

00:05:20.070 --> 00:05:21.430 align:middle
Maintenant, il y a
trois types de messages.

00:05:21.650 --> 00:05:23.210 align:middle
Pourquoi y a-t-il trois
types de messages dans Pharo?

00:05:23.410 --> 00:05:26.480 align:middle
C'est principalement pour minimiser
le nombre de parenthèse qu'on utilise.

00:05:26.900 --> 00:05:28.260 align:middle
Vous allez voir,
c'est relativement simple.

00:05:28.550 --> 00:05:30.580 align:middle
Vous avez les messages
unaires, un message unaire c'est

00:05:30.780 --> 00:05:32.560 align:middle
toujours un receveur, un sélecteur.

00:05:32.760 --> 00:05:34.170 align:middle
Là, par exemple, j'ai dit je veux 9².

00:05:35.740 --> 00:05:38.450 align:middle
Je veux obtenir la date
d'aujourd'hui, j'envoie le

00:05:38.650 --> 00:05:41.000 align:middle
message today à l'objet
date, à la classe date.

00:05:42.040 --> 00:05:43.710 align:middle
Il n'y a pas d'arguments,
ce sont des messages unaires.

00:05:44.000 --> 00:05:45.430 align:middle
Vous avez les messages binaires.

00:05:46.320 --> 00:05:48.340 align:middle
Les messages binaires
sont toujours de la forme un

00:05:48.540 --> 00:05:50.790 align:middle
receveur, un sélecteur, un argument.

00:05:51.270 --> 00:05:55.640 align:middle
Mais le sélecteur, ça sera
+, -, ~, ~, =, =, /, /, /,

00:05:56.940 --> 00:05:57.700 align:middle
ce genre de choses.

00:05:57.900 --> 00:05:59.810 align:middle
Tout ce qui a l'air de
grigri mathématique, c'est pour

00:06:00.010 --> 00:06:04.550 align:middle
les messages binaires. Là, on voit
par exemple 1 + 2, c'est un message.

00:06:04.800 --> 00:06:08.000 align:middle
On envoie le message plus à
l'objet 1 avec comme argument l'objet 2.

00:06:08.330 --> 00:06:11.550 align:middle
@ pour la création de
points, c'est aussi un message.

00:06:11.750 --> 00:06:12.600 align:middle
C'est un message binaire.

00:06:13.020 --> 00:06:17.500 align:middle
Donc là, je crée le point
3 4 en envoyant le message

00:06:17.700 --> 00:06:18.460 align:middle
@.

00:06:19.060 --> 00:06:22.120 align:middle
Après, vous avez des messages
qu'on appelle des messages à mots-clés.

00:06:22.470 --> 00:06:25.000 align:middle
Un message à mots-clés,
c'est vraiment de la forme

00:06:25.200 --> 00:06:28.730 align:middle
receveur, une clé, un
argument, une clé, un argument.

00:06:29.930 --> 00:06:32.360 align:middle
L'exemple que vous avez, c'est 2.

00:06:32.560 --> 00:06:34.850 align:middle
Est-ce que 2 est entre 10 et 20 ?

00:06:35.130 --> 00:06:37.950 align:middle
Si vous l'écriviez dans
une syntaxe Java ou C, vous

00:06:38.150 --> 00:06:39.800 align:middle
l'écririez de la forme
suivante. Vous écririez Between

00:06:40.000 --> 00:06:44.770 align:middle
and et vous

00:06:45.000 --> 00:06:47.780 align:middle
mettriez des parenthèses, 10, 20.

00:06:48.000 --> 00:06:52.530 align:middle
Dans Pharo, on va
l'exprimer sous forme clé

00:06:53.020 --> 00:06:55.800 align:middle
et clé. On va revoir ça,
évidemment, mais c'est pour vous

00:06:56.000 --> 00:06:57.310 align:middle
donner cette idée de la syntaxe.

00:06:59.040 --> 00:07:02.380 align:middle
Quand vous avez des
messages, il y a une précédence entre

00:07:02.580 --> 00:07:05.210 align:middle
ces messages, le système va
toujours exécuter en priorité

00:07:05.410 --> 00:07:08.000 align:middle
les parenthèses, puis les
messages unaires, puis les

00:07:08.200 --> 00:07:09.400 align:middle
messages binaires et
les messages à mots-clés.

00:07:09.600 --> 00:07:13.830 align:middle
Pourquoi? C'est l'idée de nous
éviter d'écrire trop de parenthèses.

00:07:14.030 --> 00:07:15.730 align:middle
On aurait très bien pu
avoir un système où on n'a pas

00:07:15.930 --> 00:07:17.300 align:middle
tout cette
différenciation, mais on mettrait des

00:07:17.500 --> 00:07:19.380 align:middle
parenthèses partout et ça
rendrait le code illisible.

00:07:21.670 --> 00:07:24.440 align:middle
Je vais revenir sur chacun de ces
types de messages de manière très simple.

00:07:25.550 --> 00:07:27.940 align:middle
Un message unaire, par
exemple, 10 000 factoriel.

00:07:28.140 --> 00:07:30.080 align:middle
Faites-le, vous allez voir,
c'est un très gros chiffre.

00:07:30.420 --> 00:07:33.800 align:middle
10 000 factoriel, j'envoie le
message factoriel à l'objet 10000.

00:07:34.000 --> 00:07:34.760 align:middle
Il n'y a pas d'argument.

00:07:34.960 --> 00:07:35.720 align:middle
C'est un message unaire.

00:07:37.000 --> 00:07:38.570 align:middle
De la même manière,
un message binaire.

00:07:38.770 --> 00:07:40.510 align:middle
1 + 3, c'est un message binaire.

00:07:42.100 --> 00:07:45.850 align:middle
Le sélecteur, ça veut dire le
nom de la méthode, là, c'est plus.

00:07:47.490 --> 00:07:51.670 align:middle
Et j'ai envoyé le message plus à
l'objet 1 avec l'objet 3 en argument.

00:07:53.270 --> 00:07:56.000 align:middle
Un message à mots-clés, c'est ce
que je vous expliquais tout à l'heure.

00:07:56.170 --> 00:08:00.000 align:middle
Je ne fais juste que répéter
parce qu'enseigner, c'est répéter.

00:08:00.910 --> 00:08:03.290 align:middle
J'ai un message mots-clés
dans lequel j'ai keyword,

00:08:03.490 --> 00:08:06.450 align:middle
keyword qui est le
message avec les arguments.

00:08:06.650 --> 00:08:11.000 align:middle
Vous avez vraiment les arguments
qui flottent à l'intérieur du message.

00:08:11.350 --> 00:08:13.280 align:middle
L'idée de cette syntaxe,
c'était de faire une syntaxe que

00:08:13.480 --> 00:08:14.630 align:middle
les enfants puissent utiliser.

00:08:15.330 --> 00:08:18.350 align:middle
L'idée, c'est d'avoir quelque
chose qui s'apparente à de l'anglais.

00:08:18.780 --> 00:08:22.700 align:middle
On va pouvoir introduire
les arguments à l'intérieur

00:08:25.550 --> 00:08:26.580 align:middle
de nos messages. Regardez un exemple.

00:08:26.780 --> 00:08:29.000 align:middle
Imaginons que je veuille
faire une requête http.

00:08:29.420 --> 00:08:33.720 align:middle
ZnClient c'est un serveur
http Pharo, donc je crée une

00:08:33.920 --> 00:08:34.910 align:middle
instance de ZnServeur.

00:08:35.110 --> 00:08:39.570 align:middle
New est un message unaire,
il n'y a pas d'argument, de

00:08:39.770 --> 00:08:40.530 align:middle
toute façon il n'y a pas deux points.

00:08:41.650 --> 00:08:46.340 align:middle
Url est un message à
mots-clés, il y a un deux

00:08:46.540 --> 00:08:50.760 align:middle
points. QueryAt:put: est un
autre message à mots-clés.

00:08:51.000 --> 00:08:54.460 align:middle
Et get est
finalement un message unaire.

00:08:55.630 --> 00:08:57.500 align:middle
Ce qu'on voit ici, sur cet
exemple, ce sont les point

00:08:57.700 --> 00:09:01.190 align:middle
virgules, on appelle ça une cascade.

00:09:03.020 --> 00:09:05.000 align:middle
La cascade, c'est l'idée de
dire je veux envoyer tous ces

00:09:05.200 --> 00:09:07.000 align:middle
messages au même objet. Ça
évite d'avoir une variable

00:09:07.200 --> 00:09:10.370 align:middle
temporaire pour rien et ça
permet d'écrire du code un

00:09:10.570 --> 00:09:11.330 align:middle
petit peu plus compact.

00:09:14.140 --> 00:09:15.210 align:middle
Ce qu'il faut voir,
c'est que les messages sont

00:09:15.410 --> 00:09:18.170 align:middle
absolument partout dans
Pharo. Les conditions, les

00:09:18.370 --> 00:09:20.230 align:middle
boucles, les itérateurs, la
concurrence, tout est exprimé

00:09:20.430 --> 00:09:22.150 align:middle
sous forme de message. Ce
que je vous ai expliqué sur les

00:09:22.350 --> 00:09:24.530 align:middle
trois messages
précédents va s'appliquer partout.

00:09:25.250 --> 00:09:27.400 align:middle
C'est la pierre angulaire du système.

00:09:28.010 --> 00:09:29.760 align:middle
Il n'y a rien d'autre
que ces messages-là.

00:09:31.420 --> 00:09:35.450 align:middle
Regardons. Là, j'ai pris la
définition débile de factoriel.

00:09:35.710 --> 00:09:37.660 align:middle
Comment est-ce que
j'ai défini ce factoriel?

00:09:38.200 --> 00:09:41.680 align:middle
Je définis ma méthode
factorielle, je mets un commentaire

00:09:42.070 --> 00:09:44.350 align:middle
pour la méthode parce qu'il
y a des doubles quotes et je

00:09:44.550 --> 00:09:47.380 align:middle
commence à dire, self, si
l'objet qui reçoit le message

00:09:47.580 --> 00:09:51.670 align:middle
est 0, alors je vais rendre
1, si self est positif, par

00:09:51.870 --> 00:09:55.000 align:middle
exemple, si je fais
factoriel 6, self vaudra 6.

00:09:55.570 --> 00:09:57.340 align:middle
Si c'est vrai, à ce
moment-là que vais-je faire, je vais

00:09:57.540 --> 00:10:01.640 align:middle
rendre quoi, 6 multiplié
par 6 moins 1 factoriel, la

00:10:01.840 --> 00:10:03.360 align:middle
définition récursive
qu'on connaît tous.

00:10:03.900 --> 00:10:08.540 align:middle
Ce qui est intéressant de
regarder, c'est de voir ici que

00:10:08.740 --> 00:10:11.550 align:middle
le message ifTrue qui est
une condition, c'est aussi un

00:10:11.750 --> 00:10:13.330 align:middle
message parce que c'est un
message à mots-clés, il a deux

00:10:13.530 --> 00:10:14.950 align:middle
points qui est envoyé à un booléen.

00:10:15.560 --> 00:10:17.060 align:middle
Donc vous avez aussi
ifTrue, ifFalse, ifFalse, ifFalse,

00:10:17.260 --> 00:10:22.000 align:middle
ifFalse, toutes ces
conditions sont des messages qui

00:10:22.200 --> 00:10:26.760 align:middle
satisfont les règles et qui
sont de la sorte des messages

00:10:27.000 --> 00:10:28.390 align:middle
à mots-clés que j'ai
présentés précédemment.

00:10:29.180 --> 00:10:30.920 align:middle
Donc, les
conditions sont des messages.

00:10:31.200 --> 00:10:32.640 align:middle
Les boucles sont aussi des messages.

00:10:32.840 --> 00:10:34.870 align:middle
Ça veut dire que là je veux
faire une boucle de 1 à 4.

00:10:35.390 --> 00:10:37.060 align:middle
De 1 à 4, que dois-je faire ?

00:10:37.260 --> 00:10:40.320 align:middle
Je vais faire un block, un
block c'est une méthode anonyme.

00:10:40.520 --> 00:10:45.330 align:middle
Je vais lui dire je veux que
tu affiches la valeur de I,

00:10:45.620 --> 00:10:50.130 align:middle
et I va prendre 1, 2, 3, 4

00:10:50.560 --> 00:10:51.320 align:middle
puisque c'est ce que je dis.

00:10:51.520 --> 00:10:55.590 align:middle
Et là, ce que vous voyez c'est que
to:do: est un message à mots-clés.

00:10:56.610 --> 00:10:59.610 align:middle
C'est un message qui va
représenter une boucle.

00:11:00.230 --> 00:11:03.240 align:middle
Il y a plein d'autres boucles dans
Pharo, timesRepeat: to:by:do: etc.

00:11:03.600 --> 00:11:04.850 align:middle
On va les voir dans le cours.

00:11:05.590 --> 00:11:10.260 align:middle
Là, to:do: est envoyé à
l'objet 1 avec comme paramètre

00:11:10.460 --> 00:11:14.250 align:middle
4 et un block. On va voir ce
qu'est un block rapidement après.

00:11:14.900 --> 00:11:16.260 align:middle
Vous avez aussi des itérateurs.

00:11:16.770 --> 00:11:19.280 align:middle
Les itérateurs, c'est
différent, c'est que j'envoie le

00:11:19.480 --> 00:11:23.160 align:middle
message, par exemple, do: à
la collection en lui disant

00:11:23.360 --> 00:11:25.350 align:middle
ce que je veux appliquer
sur chacun des éléments.

00:11:26.000 --> 00:11:30.240 align:middle
Là, le each, l'argument de
ma fonction va prendre comme

00:11:30.440 --> 00:11:34.350 align:middle
valeur 1, 2 moins 4 et moins 86.

00:11:35.010 --> 00:11:39.020 align:middle
Ce que je fais, c'est que le
each, je vais lui appliquer

00:11:39.250 --> 00:11:40.680 align:middle
la valeur absolue et
je vais l'afficher.

00:11:41.070 --> 00:11:45.600 align:middle
Encore une fois, ça sera un autre
cours, on vous expliquera les itérateurs.

00:11:46.000 --> 00:11:50.500 align:middle
Les itérateurs sont des
choses qui arrivent en Java 8 et

00:11:50.700 --> 00:11:52.710 align:middle
ça fait partie du noyau de Pharo.

00:11:54.550 --> 00:11:56.490 align:middle
Qu'est-ce qu'un block ?

00:11:56.690 --> 00:11:58.220 align:middle
Un block, c'est comme une
fonction, ça veut dire que si

00:11:58.420 --> 00:12:01.940 align:middle
en maths vous écriviez
F(x) égal x² + 3, vous avez

00:12:02.140 --> 00:12:05.100 align:middle
l'écrire comme ça,
littéralement. Je définis une

00:12:05.300 --> 00:12:07.520 align:middle
variable, j'affecte dans
cette variable quoi, un block.

00:12:07.720 --> 00:12:11.000 align:middle
Donc un block, c'est quelque
chose qui commence par des crochets.

00:12:11.180 --> 00:12:14.850 align:middle
Là, le block a un argument
qui est x et je vais mettre un

00:12:15.100 --> 00:12:16.640 align:middle
core qui est plus 3, x + 3.

00:12:16.940 --> 00:12:19.700 align:middle
Et maintenant, ce block quand
je veux l'exécuter, l'application

00:12:19.900 --> 00:12:21.520 align:middle
de fonction par rapport à
la définition, là c'était la

00:12:21.720 --> 00:12:24.520 align:middle
définition de fonction,
maintenant j'ai l'application de fonction.

00:12:24.830 --> 00:12:26.850 align:middle
Je vais envoyer le
message Value au block.

00:12:27.050 --> 00:12:31.910 align:middle
Là, si je fais value 2, x vaudra

00:12:32.320 --> 00:12:37.250 align:middle
2 et mon block va me rendre 5.

00:12:37.450 --> 00:12:38.460 align:middle
Qu'est-ce qu'un block ?

00:12:38.860 --> 00:12:40.740 align:middle
On peut considérer que c'est
une fonction anonyme, ça n'a

00:12:40.940 --> 00:12:45.900 align:middle
pas de nom, mais dans la
réalité, c'est une clôture lexicale.

00:12:46.740 --> 00:12:48.150 align:middle
On vous expliquera un
peu ce que ça veut dire.

00:12:48.500 --> 00:12:50.550 align:middle
Sinon, les blocks sont des
vrais objets à part entière.

00:12:50.780 --> 00:12:52.820 align:middle
Je peux les passer comme
argument de méthode, je peux les

00:12:53.020 --> 00:12:54.710 align:middle
stocker dans des variables
d'instance, ils peuvent être

00:12:54.910 --> 00:12:57.760 align:middle
retournés et ça nous sert,
par exemple, pour les triggers

00:12:58.000 --> 00:13:01.020 align:middle
de boutons, pour des
callback dans des applications web,

00:13:01.220 --> 00:13:02.350 align:middle
ils sont faits avec des blocks.

00:13:05.050 --> 00:13:07.100 align:middle
L'utilisation des blocks,
on l'a déjà vue, par exemple

00:13:07.300 --> 00:13:08.670 align:middle
pour les itérateurs,
vous avez eu des blocks.

00:13:09.040 --> 00:13:12.040 align:middle
On les a eus aussi pour les
conditions, on a utilisé des blocks dedans.

00:13:12.240 --> 00:13:13.530 align:middle
Il y aura un cours dédié au block.

00:13:13.750 --> 00:13:16.090 align:middle
C'est quelque chose de très
élégant, ça a été introduit

00:13:16.290 --> 00:13:19.090 align:middle
dans Eiffel, je l'ai dit
récemment, ça a été introduit dans Java 8.

00:13:19.450 --> 00:13:21.400 align:middle
Il y a eu une première
version qui a été aussi introduite

00:13:21.600 --> 00:13:23.330 align:middle
dans C Sharp, c'est quelque
chose qui est fondamental.

00:13:23.530 --> 00:13:25.740 align:middle
Il se trouve que les blocks
sont un élément fondamental

00:13:26.540 --> 00:13:29.490 align:middle
de la syntaxe et du
modèle de calcul de Pharo.

00:13:31.200 --> 00:13:34.020 align:middle
Comment est-ce qu'on
définit une classe dans Pharo?

00:13:35.840 --> 00:13:38.250 align:middle
Le browser va vous montrer
des packages, vous allez avoir

00:13:38.450 --> 00:13:41.130 align:middle
un ensemble de classe à
l'intérieur, et ils vous montrent un template.

00:13:41.330 --> 00:13:44.560 align:middle
Vous avez là un template
qui dit, par défaut, tu es

00:13:44.760 --> 00:13:48.140 align:middle
ReadObject et puis il faut
mettre le nom de la classe.

00:13:49.070 --> 00:13:51.140 align:middle
On va voir ça sur la
 classe point, par exemple.

00:13:51.390 --> 00:13:52.330 align:middle
Comment est définie la classe point ?

00:13:53.630 --> 00:13:56.210 align:middle
J'ai la classe Object, je
lui envoie le message, c'est

00:13:56.410 --> 00:13:58.150 align:middle
aussi un message, le message
subclass instanceVariableNames, etc.

00:14:02.410 --> 00:14:05.690 align:middle
Je dis je veux définir la
 classe point et je lui donne

00:14:05.890 --> 00:14:07.270 align:middle
les variables d'instances X et Y.

00:14:08.720 --> 00:14:10.760 align:middle
C'est juste pour vous
montrer que la syntaxe suit

00:14:11.000 --> 00:14:13.350 align:middle
toujours le même
modèle avec des messages.

00:14:13.910 --> 00:14:17.420 align:middle
En général, on ne s'amuse pas
à l'écrire à la main, l'outil

00:14:17.620 --> 00:14:20.460 align:middle
vous donne le template et
puis vous remplissez dedans.

00:14:23.190 --> 00:14:24.810 align:middle
Comment est-ce qu'on
définit une méthode?

00:14:25.260 --> 00:14:28.020 align:middle
Les méthodes sont
publiques et virtuelles et que, par

00:14:28.220 --> 00:14:29.000 align:middle
défaut, elles retournent Self.

00:14:29.410 --> 00:14:32.510 align:middle
Quand on est dans le
browser de code, ce qu'on va voir,

00:14:32.710 --> 00:14:33.670 align:middle
il nous propose aussi un template.

00:14:33.870 --> 00:14:36.240 align:middle
Le template, ça va être le
nom de la méthode potentielle.

00:14:36.640 --> 00:14:41.000 align:middle
Un commentaire parce qu'on est
des gens bien élevés et qu'on

00:14:41.200 --> 00:14:42.000 align:middle
commande notre code.

00:14:42.160 --> 00:14:44.440 align:middle
Et puis, potentiellement,
on va utiliser des variables

00:14:44.940 --> 00:14:47.870 align:middle
temporaires et des
expressions. Qu'est-ce que ça donne?

00:14:48.100 --> 00:14:49.370 align:middle
On a déjà vu une méthode factorielle.

00:14:49.570 --> 00:14:53.850 align:middle
Par exemple, je suis dans
la classe Integer, je regarde

00:14:54.050 --> 00:14:54.810 align:middle
la méthode factorielle.

00:14:55.010 --> 00:14:57.230 align:middle
Là, j'ai le code de la
méthode factorielle avec le nom de

00:14:57.430 --> 00:15:00.870 align:middle
la méthode, son commentaire et le
core de la méthode que j'ai définie.

00:15:04.300 --> 00:15:05.260 align:middle
En résumé, qu'avons-nous vu ?

00:15:05.460 --> 00:15:07.850 align:middle
On a vu qu'il y avait trois
sortes de messages dans Pharo.

00:15:08.050 --> 00:15:09.790 align:middle
Il y a les messages unaires
où il n'y a pas d'arguments,

00:15:10.000 --> 00:15:12.260 align:middle
les messages binaires où les
sélecteurs sont tout ce qui

00:15:12.460 --> 00:15:14.770 align:middle
est mathématique et les
messages à mots-clés qui sont les

00:15:15.000 --> 00:15:17.550 align:middle
messages où il y a un ou
plusieurs arguments, qu'il y a

00:15:17.750 --> 00:15:20.110 align:middle
une priorité, ça veut
dire qu'on va exécuter les

00:15:20.310 --> 00:15:21.760 align:middle
parenthèses en premier,
puis les messages unaires,

00:15:22.000 --> 00:15:24.010 align:middle
binaires et à mots-clés;
et que si on est au même

00:15:24.210 --> 00:15:25.730 align:middle
niveau, on va
exécuter de gauche à droite.

00:15:25.930 --> 00:15:26.690 align:middle
Et on a vu toute la syntaxe.

00:15:27.860 --> 00:15:29.120 align:middle
Cette séance est terminée.

00:15:29.320 --> 00:15:31.030 align:middle
Qu'avons-nous vu? La
syntaxe est très, très compacte.

00:15:31.230 --> 00:15:35.200 align:middle
Il y a très peu de constructeurs
et ils sont tous très expressifs.

00:15:35.400 --> 00:15:38.010 align:middle
Ce sont principalement des
messages et des fermetures

00:15:38.210 --> 00:15:40.850 align:middle
lexicales ou des blocks. Il
y a trois types de message.

00:15:41.780 --> 00:15:45.180 align:middle
On vous fera faire un petit
exercice pour développer un petit langage.

00:15:45.390 --> 00:15:48.620 align:middle
Ça permet de définir des langages
qu'on appelle Domain Specific Languages.

