Bonjour, cette semaine, on va commencer à rentrer un peu
plus dans le vif du sujet, en particulier de la syntaxe.
Ce cours, c'est essentiellement comment vous allez
aborder la syntaxe des messages qui sont utilisés dans
Pharo, ça veut dire pratiquement tout Pharo, en fait.
Ce qu'il faut voir, c'est que dans Pharo, vous avez
principalement trois choses: des objets, des messages et
des clôtures qu'on appelle des blocks.
Vous aurez un cours spécial sur les blocks.
Et avec ça, vous faites toute la syntaxe Pharo, pratiquement.
Ce qu'il faut voir, c'est que la syntaxe de Pharo hérite
de celle de Smalltalk qui avait été inventé pour
apprendre aux enfants à programmer. L'idée, c'est d'écrire
des programmes qui sont comme des petites phrases qu'un
enfant pourrait écrire. Aussi, une des idées derrière la
syntaxe, c'est de minimiser le nombre de parenthèses et
on va voir ça à l'œuvre.
On prend un exemple.
On prend une tuile sur openstreetmap et on veut l'ouvrir
dans une fenêtre graphique.
Ça vous donne l'idée de la syntaxe, j'ai des parenthèses,
parce que d'abord je veux récupérer un png, donc j'ai des
parenthèses et ce png, je vais le convertir dans un objet
graphique Pharo et puis je vais l'ouvrir dans une fenêtre.
Je vous suggère de le faire sur Pharo, vous allez obtenir
le résultat, probablement de l'eau parce que les tuiles,
il y en a beaucoup avec de l'eau.
Dans Pharo, la syntaxe, il y a trois sortes de messages
qui sont vraiment faits pour minimiser le nombre de parenthèses.
Vous avez des messages unaires, des messages binaires et
des messages à mots-clefs. Donc, on va voir ça.
Les messages unaires, en gros c'est un receveur, le nom de la méthode.
Les messages binaires, c'est un receveur, le nom du
sélecteur et un argument. Les messages à mots-clefs, c'est
un receveur, des arguments ou un et essentiellement le
signe distinctif, c'est les deux points qu'il y a ici et
on va voir ce genre de choses.
Ce qu'il faut voir, c'est qu'une fois qu'on a fait trois
types de messages, à quoi ça sert ?
Ça sert à pouvoir les différencier, donc ça va changer l'exécution
des programmes. On va toujours exécuter en premier les
parenthèses, les expressions parenthésées, et les
messages unaires, les messages binaires et les messages à mots-clefs.
Et puis, si on est au même niveau, on le fera dans le
même ordre de gauche à droite.
Si on prend des exemples de messages unaires, si je
demande au petit entier 1 "Quelle est ta classe?",
il va me dire "C'est SmallInteger.
" Si j'envoie le message "not", d'ailleurs ça serait un
exercice pour la semaine prochaine, au booléen false, j'obtiens
le booléen true. Si je demande à la classe date
"Donne-moi la date d'aujourd'hui", il va me donner par
exemple le 24 mai 2009 qui est un objet date.
Si j'envoie le message "pi" à la classe "float", il va me
donner une représentation de l'objet "pi".
Je ne sais pas si vous avez remarqué, mais en fait j'ai
envoyé des messages à des objets et j'ai aussi envoyé des
messages à des classes et j'ai fait ça de la même manière.
Je n'ai pas dit "Attention, c'est une classe, serrez les
dents, il faut faire quelque chose de spécial", non.
Là, j'envoie le message classe au petit entier, ça me rend la classe.
J'envoie le message today à la classe date, ça me rend une date.
Rien de spécial, dans Pharo, les classes sont aussi des
objets et les messages envoyés à des classes sont traités
comme des messages envoyés aux instances, il n'y a pas de
différence et c'est tout à fait naturel.
Maintenant, je voulais vous proposer un petit exercice
qui n'a rien à voir avec la syntaxe pour s'amuser un peu.
Là aussi, je me suis dit "Tiens, ça serait rigolo, je
voudrais savoir quelles sont toutes les méthodes qui sont
implémentées dans la classe points", donc je peux faire
ça avec Pharo et c'est un message unaire.
Je peux dire "classe Point, donne-moi tous les noms de
messages que tu comprends" et il me répond une grande
liste avec tous les messages. Vous voyez la facilité avec
laquelle on peut construire des outils.
Avec ça, si je le mets dans une liste, je vais pouvoir
avoir, par exemple, une liste avec toutes les méthodes
que la classe répond et c'est comme ça que fonctionne le
browser que vous allez utiliser.
Maintenant, on peut raffiner un petit peu ça.
On pourrait dire "Finalement, j'aimerais demander au
système tous les sélecteurs de la classe Point qui sont unaires.
" Je l'écris comme ça, je dis "Classe Point, donne-moi
tous tes sélecteurs", ça va me rendre un tableau ou une collection.
Ça, c'est un message à mots-clefs, je dis "Je
veux sélectionner parmi ces sélecteurs ceux qui sont unaires.
" Là, il y a une query qui s'appelle isUnary qui est un
message sur les noms de méthodes qui va sélectionner ce genre de choses.
Là, je vous ai fait un petit aparté dans la syntaxe, vous
verrez ça lors du cours sur les itérateurs parce que
select est un itérateur. Mais vous voyez comme c'est
élégant, en fait en une ligne, je peux faire des query sur le système.
Il y a les messages binaires, je vous ai dit que c'est
un objet, un sélecteur binaire et un argument.
Les sélecteurs binaires, c'est une combinaison parmi tous
ces trucs incompréhensibles ou qu'on ne peut pas prononcer: %, |.
Tout ce qui n'est pas compréhensible, il y a des messages
binaires ou tout ce qui ressemble à des maths, ce sont
des messages binaires. Un exemple, j'envoie le message
plus à l'objet 1 avec un argument l'objet 2, ça me donne 3, on est content.
J'ai >, c'est pareil c'est un message binaire.
Le @ qui crée des points, c'est aussi un message binaire.
La concaténation de chaînes avec virgule, c'est un message binaire.
Là je vais faire'Black chocolate'virgule'is good', j'obtiens
la chaîne "Black chocolate is good".
Les messages à mots-clés, ça, c'est le truc qui frustre souvent les gens.
Quand vous avez l'habitude d'une syntaxe à la C ou à la
Java avec une syntaxe avec un point et des parenthèses et
une virgule au milieu, nous on le fait comme ça, on le
met au milieu.
Ce qu'il faut bien voir ici dans cet exemple, c'est que
le message s'appelle keyword1, keyword2.
Le message est bien entier là, il est composé de deux parts.
Pour vous tester, on va faire un jeu deux petites
secondes : à quoi correspondent ces
messages ? Quels sont leurs types ?
On voit que le premier, il n'y a pas d'argument, donc ça doit être unaire.
Le deuxième, il n'y a pas d'argument, ça doit être unaire.
Là il y a un deux points, ça doit être un mot-clef.
Il y a un truc que je ne comprends pas avec une virgule, c'est binaire.
C'est un truc bizarre, c'est binaire.
Il n'y a pas d'arguments, c'est unaire.
Il y a un deux points, c'est un mot-clef.
Ça a l'air difficile comme ça, mais… Donc, voilà la solution.
Un exemple, imaginons que je veux changer la valeur de x d'un point.
J'ai un point qui est un message binaire
et je vais faire cet x avec un argument, ça me rendra un
point dans lequel 2 a été changé.
Ça n'a pas l'air bien fou quand même.
Une autre chose, un message at:put:, donc là j'ai un
tableau qui contient
des chaînes'Calvin''hates''Suzie'et
je veux changer le deuxième élément, je vais faire at: 2
put:'loves'; 2, ça va être celui-là et loves va venir ici.
Là sur le tableau ce que vous voyez, c'est que la méthode
s'appelle at: put:, c'est la méthode pour changer la
valeur d'une collection à un indice donné.
Ce que vous voyez aussi et on aura un cours là-dessus, c'est
que les collections en Pharo commencent à 1 et pas à 0.
Donc je dis "Je veux le deuxième élément", je fais 1 2 et
pas "Ah oui, ça commence donc il faut que je soustraie un truc.
" Un autre exemple qui montre encore une fois, pour s'appesantir,
les messages à mots-clefs.
Quand je demande "Est-ce que 12 qui est un entier est
entre 10 et 20?", c'est le message beetween:
and: qui correspondrait
dans ma syntaxe "Est-ce que 12 point beetween: and:
10, 20 ?"
Je pense que je me suis assez alourdi dessus pour qu'on passe à autre chose.
En résumé, vous avez trois sortes de messages: les
messages unaires, les messages binaires et les messages à
mots-clefs, et c'est tout.