A la découverte de Golo
En dĂ©but dâannĂ©e, jâai eu la chance de contribuer Ă un projet open-source en tant que testeur (utilisateur qui sâamuse). Ce projet câest Golo http://golo-lang.org/, un langage qui âtourneâ dans la JVM Java. Encore un! me direz vous ? Et pourquoi pas ? Son crĂ©ateur @jponge explique trĂšs bien le comment du pourquoi (ainsi que les spĂ©cificitĂ©s) par ici https://speakerdeck.com/jponge/golo-at-devoxx-france-2013, mais aussi par lĂ https://speakerdeck.com/jponge/golo-au-lyonjug-mars-2013, ou bien en avant premiĂšre en Auvergne https://speakerdeck.com/jponge/golo-au-lavajug.
Au passage, merci Ă @hgomez qui mâa parlĂ© de ce projet, ce qui mâa permis dâaller em⊠@jponge pour ĂȘtre testeur.
Cette expĂ©rience a Ă©tĂ©, est (sera) enrichissante techniquement (faut utiliser Golo pour comprendre), humainement : jâai eu le plaisir de voir que je ne suis pas le seul geek âseniorâ avec des idĂ©es Ă la c⊠en rĂ©gion, @titimoby si tu me lis ;) NDA : il est beaucoup plus jeune que moi.
Jâai doucement caressĂ© le rĂȘve de faire une prez Ă Mix-IT sur le sujet avec @titimoby, ça nâa pas marchĂ© :( mais quand on voit le niveau des speakers 2013, câest comprĂ©hensible :) et vivement les 25 et 26 avril. Du coup jâĂ©crit ici une partie de ce que je voulais prĂ©senter.
Mais ça suffit pour les blablas, passons tout de suite Ă la pratique et voyons comment faire âgologolo en douceurâ.
Je ne vous parlerais pas des âbasiquesâ (if, while, for ...
) pour ça il y a une documentation trĂšs bien faite http://golo-lang.org/documentation/next/. Je vais juste vous montrer comment jâutilise Golo, aprĂšs chacun son style ;).
Ceci nâest quâun 1er aperçu des possibilitĂ©s de Golo.
Installons
- avoir une JVM
- tĂ©lĂ©charger la bĂȘte : http://golo-lang.org/download/
- dézipper
- mettre Ă jour votre
PATH
1Úre fois ⊠Toute 1Úre fois
Telle une jeune vierge effarouchĂ©e Ă son premier rendez vous, vous ĂȘtes tout fĂ©brile, comment allez-vous vous en sortir ? Pas de problĂšme, câest facile. Avec votre Ă©diteur de texte prĂ©fĂ©rĂ© (votre serviteur a fait un mini support pour Sublime Text 2 : https://github.com/k33g/sublime-golo), crĂ©ez votre premier fichier golo : hello.golo
avec ceci (incontournable) :
et dans un terminal tapez ceci : gologolo hello.golo
et lĂ sans surprise vous obtiendrez Salut Ă tous!
. Soyez fous et modifiez votre code de la maniĂšre suivante :
puis (encore dans le terminal) : gologolo hello.golo --args Bob
et là vous obtiendrez ⊠Salut Bob
.
Explications
aget(args, 0)
prend le 1er Ă©lĂ©ment (index 0) du tableau dâarguments. Pour une description de la gestion des Arrays en Golo câest par lĂ http://golo-lang.org/documentation/next/# _arrays
2Ăšme fois : import
VoilĂ , vous avez fait âgologoloâ, vous pouvez passer au niveau supĂ©rieur (on reste dĂ©butant mais on prend un peu dâassurance).
Créez un fichier tools.golo
:
puis un fichier main.golo
:
Nous avons donc fait un import
de nos fonctions du module tools
. Soit dis en passant nous pourrions appeler nos fonctions de cette maniĂšre tools.hello("Douglas Adams")
, tools.add(40, 2)
, tools.sub(44, 2)
.
Pour lancer, utilisez la commande suivante : gologolo tools.golo main.golo
et vous obtiendrez :
Salut Douglas Adams
42
42
Au fait, vous avez vu ? Vous avez une formulation âcompacteâ de function sub =|a, b| -> a-b
utilisée pour les closures, pour creuser le sujet http://golo-lang.org/documentation/next/# _closures
Un peu plus de sport ? De lâobjet, de lâobjet !
Alors, probablement la chose que je prĂ©fĂšre dans Golo (mais câest trĂšs personnel) : le DynamicObject().
De nous jours, si dans un langage on ne peut plus faire dâobjet, ce nâest pas drĂŽle. Eh bien en Golo, pour cela nous avons les DynamicObjects. Un DynamicObject est un objet auquel on peut rajouter dynamiquement des propriĂ©tĂ©s (getters/setters) et des mĂ©thodes.
KĂ©zaco ?
Parlons peu, parlons bien, un exemple est plus parlant quâun long discours (et blablablabla âŠ) :
qui a lâexĂ©cution nous affichera :
Bob
Morane
Hello i'm Bob Morane
# On récapitule
- Pour ajouter une propriété :
property_name()
ouproperty_name(default_value)
- Pour ajouter une 2Ăšme propriĂ©tĂ©, la notation est âchaĂźnĂ©eâ (Ă la jQuery) :
property_one_name():property_two_name()
- Pour ajouter une méthode :
define("method_name", |this, parameter| { # foo ... })
(toujours lethis
en 1er paramÚtre de méthode, le#
câest pour les commentaires) - Pour utiliser lâobjet ainsi dĂ©fini,
bob()
les()
sont importantes, cela correspond Ă une instanciation - Pour utiliser un âmembreâ de bob, on utilise
:
, par exemplebob():firstName()
retourne la valeur defirstName
etbob():firstName("Bobby")
change la valeur defirstName
- il est possible dâajouter des propriĂ©tĂ©s Ă la volĂ©e Ă lâinstance
bob()
debob
Le DynamicObject utilisé comme une classe ?
Pour se faire, ce nâest pas difficile, on externalise le DynamicObject de main
par le biais dâune fonction.
- vous remarquerez que
bob
nâa plus de()
puisque lâon a fait une affectation de lâinstance deHuman()
- vous remarquerez aussi que lâon
set
les propriĂ©tĂ©s âinline et Ă la chaĂźneâ :Human(): firstName("Bob"): lastName("Morane")
- vous remarquez que cette fois-ci jâai mis un espace aprĂšs les
:
, câest juste pour faire joli, ce nâest pas obligatoire
et vous obtiendrez donc :
Bob
Morane
Hello i'm Bob Morane
Hop hop hop, je nâai pas de constructeur ?
Eh bien non, mais cela se contourne trÚs bien, il suffit de vous créer une méthode intialize
(en fait vous lâappelez comme vous voulez) qui retourne lâobjet lui mĂȘme :
OK, mais lâhĂ©ritage, tu fais comment ?
LâhĂ©ritage cĂ©mal, la composition câest bien. Ok, câest pas faux. Mais comme @jponge il est trĂšs sympa (et que moi, je peux ĂȘtre lourdement pĂ©nible) il nous a ajoutĂ© un petit truc bien pratique : le mixin()
qui ne dépaysera en rien les amoureux du javascript et de la programmation fonctionnelle. Le mixin()
copie les membres dâun DynamicObject sur un autre.
Nous obtiendrons :
Clark
Kent
Hello i'm Clark Kent
SuperMan is saving people
Remarque : la position du mixin()
dans la définition du DynamicObject est importante si vous surchargez des membres (attention de ne pas les écraser).
Fun & pratique :)
Si vous souhaitez en savoir plus sur les DynamicObjects, RTFM : http://golo-lang.org/documentation/next/# _dynamic_objects.
Câest tout pour aujourdâhui, dans les prochains Ă©pisodes, nous verrons (peut-ĂȘtre pas dans cette ordre):
- Golo parle Ă Java, mais Java aussi (on parlera un peu des closures quand mĂȘme)
- Golo et les Workers, ou comment se la jouer avec les threads
- ⊠je vous parlerez aussi de ma stack web en pur Golo (un mini Play!>Framework en Golo)
Utilisez le, câest lâadopter!
Si vous faites des petites fonctions sympa, des mini frameworks (ou mĂȘme mega) vous pouvez aller les enregistrer ici pour montrer votre support : http://k33g.github.com/nano.golo/. Si vous aves des question, câest chez Stackoverflow aussi : http://stackoverflow.com/questions/tagged/golo-lang.
BientĂŽt le week-end, profitez-en pour faire gologolo ⊠(je sais âŠ)
Tweet