mardi 26 juillet 2016

perl6

Ah ouais quand même, 1 an & 3 mois sans article !
Bah normal je n'obtiens pas assez de retours sur ce que je poste ici, donc je ne poste plus grand chose... !
Mais je l'utilise quand même quand j'ai un gros truc à poster comme ici, ça parle d'info donc ceux qui ne sont pas intéressés peuvent zapper tout de suite !

C'est sur comment se frotter à perl6 et pourquoi le faire.
Déjà le pourquoi, y a pas de raison urgente, il fait chaud, on a le temps, et y a des trucs très originaux dans le langage, du style manipulation des rationnels sans le dire ce qui lui donne une précision peu commune avec les nombres à virgules, et quelques avantages par rapport à perl5 du point de vue style (rien que la gestion de tableaux dans les tableaux déjà !). Bon maintenant ça reste plutôt lent quand on est habitué à perl5, mais il faut quand même nuancer en disant que quand on le lance il charge sa machine virtuelle d'abord et du coup si on le chronomètre sur des petits scripts il risque de se faire écrabouiller par perl5 ! Et bon ils sont en train de l'accélérer, ça s'est amélioré déjà au point où ça devient utilisable, mais on peut pas dire que ça soit super rapide encore !

Bon, comment s'y frotter : la méthode recommandée c'est rakudobrew, là : https://github.com/tadzik/rakudobrew
Alors comme ils disent c'est "quick and dirty", le but c'est de pouvoir se tenir à jour facilement vu qu'ils sortent en moyenne une version tous les 3 mois, mais y a des trucs qui ne sont pas ou mal indiqués :
 - déjà si on veut mettre à jour en faisant "rakudobrew build v6.c" pour avoir la dernière version 6.c, il ne met à jour que perl6 si on a déjà une version de rakudo d'installée il utilise le vieux moarvm pour le faire tourner ! Après on a plus qu'à faire "rakudobrew build moar 2016.07.1" pour mettre à jour moar.
 - Ensuite les modules. Ce n'est pas indiqué dans son aide, mais rakudobrew permet aussi d'installer panda le gestionnaire de modules et c'est très dur de s'en passer, donc il faut faire au moins 1 fois "rakudobrew build panda".
 - Ensuite l'une des nouveautés intéressantes par rapport à perl5 c'est qu'on a enfin un interpréteur interactif en ligne de commande quand on tape perl6 sans paramètre. Par contre readline n'est pas inclus par défaut donc il faut installer le module avec panda, d'où l'intérêt de construire panda comme indiqué au dessus. Puis faire "panda install Readline", ça marchera beaucoup mieux après ça !
 - Ensuite c'est un truc qui est prévu pour garder plusieurs versions en même temps sur le disque et pouvoir basculer de l'une à l'autre en cas de problème ou pour comparer. Pour un utilisateur lambda ça sert à rien donc penser à virer les vieilles : "rakudobrew list" pour voir celles dispo, et "rakudobrew nuke xxx" pour virer la xxx.
 - Et enfin les docs pdf ne font pas partie des dépots git apparemment, ou alors j'ai pas trouvé comment récupérer les pdf à partir de ça, donc il faut aller les chercher dans le tar.gz, il y a 2015-spw-perl6-course.pdf qui est une série de transparents qui ont du être utilisés à une présentation quelconque comme introduction à perl, bien foutu pour avoir un 1er aperçu, et perl6intro.pdf qui est un bouquin + traditionnel.

Ouf !

Bon allez un petit exemple de truc à faire, j'utilise ça pour tester la vitesse de l'interpréteur sur un petit script mais c'est pas terrible jusqu'ici. Un petit problème d'admin système, il faut avoir la date en secondes par rapport au 1/1/1970 de la veille à 0h. En perl5 on peut écrire ça comme ça :
#!/usr/bin/perl

use Time::Local;
use v5.10;

my ($sec,$min,$hour,$mday,$mon,$year) = localtime(time()-3600*24);
my $t = timegm(0,0,0,$mday,$mon,$year);
say $t;


L'équivalent en perl6 :
use v6;

my $d = DateTime.new((time)-24*3600).clone(:hour(0),:minute(0),:second(0));
say $d.posix;
C'est un peu + clair et un peu + bref en perl6, par contre c'est 10x + lent quand on ne lance un interpréteur que pour faire ça !

Une micro intro aux trableaux de tableaux : en perl5 on est obligé d'utiliser des références pour ça parce que push @a,(1,2,3) suivi de push @a,(4,5,6) produit un tableau de 6 éléments, donc il faut remplacer les parenthèses par des crochets pour avoir les références et ça devient rapidement bordelique.
Dans perl6 y a plus, ça redevient intuitif les 2 push avec parenthèses créent bien 2 tableaux de 3 éléments à la suite. Par contre pour y accéder on ne fait plus $a[1][1] mais @a[1][1]. Ouais, je ne suis pas sûr que renforcer le sens des caractères de type était une super idée, je crois que beaucoup de monde aurait apprécié d'en avoir moins en déclarant le type de l'identifiant avant, mais bon on verra bien à l'usage, en tous cas c'est déjà pas mal d'éviter des références pour rien ici...

Et la démonstration des rationnels en action, avec perl5 ou tout langagne normal ça donne
perl -e 'print (0.1 + 0.2 == 0.3 ? "yes\n" : "no\n");'
-> no
en perl6 :
perl6
To exit type 'exit' or '^D'
> say 0.1 + 0.2 == 0.3
True


Allez j'arrête là pour l'instant c'est assez pour voir si on a envie de démarrer !