Créer un langage pour enfants à partir de Golo
Introduction
Mes enfants (7 & 8 ans) me voient collĂ© Ă mon micro plus quâil ne faudrait. Un jour, ils ont souhaitĂ© que je leur explique la âprogrammationâ. Câest ma fille qui a commencĂ© Ă 5 ans avec du Ruby, mais les concepts ne sont pas forcĂ©ment simples, qui plus est quand Ă lâĂ©cole ils nâont pas encore toutes les notions de math ou de logique, sans parler de lâanglais! Donc, mĂȘme si ça les attire (imaginez un truc qui compte Ă votre place!), ils peinent un peu (il doit aussi y avoir la pĂ©dagogie de leur pĂšre en cause).
En Ă©tudiant Golo, et au fur et Ă mesure de ma comprĂ©hension (merci @jponge pour ses patientes explications), je me suis dit âet si je me servais de Golo pour apprendre le dĂ©v Ă mes rejetons ?â. Du coup je leur ai demandĂ© de commencer Ă me âspĂ©cifierâ un langage sur papier (vu quâils sont punis de tĂ©lĂ©, de tablette, dâordi pour 4 semaines, ça les occupe bien). A ma grande surprise, ils sont en train de le faire, et en plus ils avancent bien et ils ont choisi le thĂšme du Zoo.
Je me retrouve donc dans une situation, oĂč il va falloir faire ce langage pour enfants! Donc ce matin, jâai voulu qualifier la faisabilitĂ© de ce projet (et ma capacitĂ© Ă le faire).
Et bien, je vous lâaffirme, Golo est un parfait âgĂ©nĂ©rateurâ de langage!!! ⊠et je ne vais pas passer pour un incapable auprĂšs de mes 2 dictateurs prĂ©fĂ©rĂ©s :).
Voci donc la recette du jour (et je mâamuse comme un petit fou) pour crĂ©er un langage, et se la jouer grave ensuite :)
Pour ceux qui ne connaisse pas Golo, câest par ici http://golo-lang.org/.
Allez, câest parti, nous allons voir :
- comment ajouter des âobjetsâ utilisables dans Golo
- comment ajouter des fonctions prédéfinies
- et mĂȘme comment changer certains verbes de base
Pas dâinquiĂ©tude, câest ULTRA-FACILE.
Préparation
Commencez donc par cloner le repository de golo :
git clone https://github.com/golo-lang/golo-lang.git
vous disposez maintenant de tout ce quâil faut pour vous amuser :)
Ajouter des animaux
⊠je vous rappelle que le thĂšme, câest le Zoo.
Nous allons donc dĂ©jĂ ajouter simplement de nouveaux âobjetsâ Ă Golo, que nous allons implĂ©menter dans le package gololang.zoo
, pour cela dans le projet Golo, vous devez, au sein du package gololang
, créer un package zoo
:
Ensuite, nous développons quelques classes et interfaces qui seront la base de notre langage pour enfants :
Animal.java :
Position.java
Mammifere.java
Lion.java
Compiler
Nous pouvons déjà recompiler Golo. Vous vous positionnez dans le répertore /golo-lang
et âlancezâ la commande suivante :
rake special:bootstrap
Au bout de quelques instants (quand câest terminĂ© donc) vous obtenez le rĂ©pertoire /<chez_vous>/golo-lang/target/golo-0-preview3-SNAPSHOT-distribution/golo-0-preview3-SNAPSHOT
(en fonction des version les noms peuvent changer) qui contient un Golo utilisable. Faites donc pointer vos variables dâenvironnement dessus :
GOLO_HOME=/<chez_vous>/golo-lang/target/golo-0-preview3-SNAPSHOT-distribution/golo-0-preview3-SNAPSHOT; export GOLO_HOME
export PATH=$PATH:$GOLO_HOME/bin
Utiliser
Nous allons maintenant créer un script zoo.golo
:
Lancez : gologolo zoo.golo
, et ⊠:
LĂ©o le lion
x: 4 y: 7
Groooooaaaaaarrrrr!!!
Je suis LĂ©o le lion... Groooooaaaaaarrrrr!!!
NâĂȘtes vous pas dĂ©jĂ un peu fier, lĂ ?
Ajouter une fonction prédéfinie
Le projet Golo a une classe trĂšs pratique Predefined.java
dans le package gololang
, qui permet dâajouter des sortes de mots-clĂ©. Câest lĂ que vous avez lâimplĂ©mentation de println()
par exemple. Pour résumer, Predefined.java
comporte un ensemble de méthodes statiques réutilisables en Golo comme mots-clé. Voyon donc comment ajouter des mots-clé :
Je nâaime dĂ©finitivement pas concatĂ©ner des chaĂźnes de caractĂšres, donc Ă la place de "x: " + leo:position():x() + " y: " + leo:position():y()
jâaimerais pouvoir Ă©crire "x: %s y: %s", leo:position():x(), leo:position():y()
ou Ă la place de "Je suis " + leo:nom() + "... "
avoir "Je suis %s ... ",leo:nom()
. Allons-y!
Ajoutez les 2 méthodes ci-dessous dans Predefined.java
:
formater:
afficher:
Maintenant, compilez Ă nouveau Golo (rake special:bootstrap
) et modifiez votre script zoo.golo
de la maniĂšre suivante :
Lancez : gologolo zoo.golo
, et ⊠:
Mon est LĂ©o le lion
x: 4 y: 7
x: 004 y: 007
LĂ©o va rugir : Je suis LĂ©o le lion ... Groooooaaaaaarrrrr!!!
Et lĂ , au sentiment de fiertĂ© prĂ©cĂ©dent, sâajoute un dĂ©but dâimpression, voire dâintelligence âinhabituelleâ ;) De lĂ Ă dire que Golo rend intelligent, il nây a quâun pas ⊠que je franchis allĂšgrement :)))
Encore un peu plus loin
Depuis un moment, vous devez vous dire que ma manie de mettre du français dans mon code est un peu bizarre, voire câest mal, ça ne se fait pas, je suis un hĂ©rĂ©tique! Je vous rappelle que le besoin initial, câest apprendre la programmation Ă de jeunes enfants, alors si en plus, ils doivent apprendre lâanglais, ils vont devenir chĂšvres.
Avez-vous essayĂ© dâexpliquer le concept de variable et valeur de variable Ă des enfants de 8 ans et moins de 8 ans (5 ans!) ? En ce qui me concerne, la notion de boĂźte dâalumettes, marche pas mal (avec un nombre dâalumettes dans la boĂźte) ou la notion de case peut aussi faire lâaffaire.
Donc Ă la place de let leo = Lion("LĂ©o le lion")
je voudrais la_case leo = Lion("LĂ©o le lion")
et comme jâai pris de lâassurance dans les paragraphes prĂ©cĂ©dents, Ă la place de if {} else {}
, je veux si {} sinon {}
. Voui Monsieur!
Eh bien, câest extrĂȘment facile :
Allez faire un tour dans le projet Golo par ici : /src/main/jjtree/Golo.jjt
:
- cherchez
< LET: "let" >
et remplacez par< LET: ("let" | "la_case") >
(vous pourrez ainsi continuer Ă utiliserlet
) - cherchez
< IF: "if" >
et remplacez par< IF: ("if" | "si") >
- cherchez
< ELSE: "else" >
et remplacez par< ELSE: ("else" | "sinon") >
Compilez Ă nouveau Golo (rake special:bootstrap
), et maintenant vous pouvez Ă©crire des choses comme celle-ci :
Je nâai maintenant plus quâĂ tester avec mes petits bouts. Je vous en donnerais des nouvelles. De votre cĂŽtĂ©, plus dâexcuses pour vous mettre Ă Golo, augmenter Golo ⊠;)
42. ;)
Tweet