Tutoriel Programmation objet immersive en Pharo proposé par l'inria disponible à l'adresse https://mooc.pharo.org et sur la plateforme FUN-MOOC.
Présentation par Stéphane Ducasse, directeur de recherche, à l'Inria.
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'Calvinhates
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.