[Perl] Rakudo : comment faire cohabiter deux versions du même module ?

Jean ponder.stibbons at orange.fr
Mer 2 Oct 20:03:19 CEST 2024


Dans Rakudo, il est possible d'installer deux versions d'un même
module. Je prends l'exemple du module de calendrier Aztèque, car la
version 0.0.2 comporte un attribut 'daycount', qui est absent de la
version 0.0.1. On peut installer les deux versions avec :

   -*-*-*-*- début du script shell
   git clone https://github.com/jforget/raku-Date-Calendar-MayaAztec.git
   cd raku-Date-Calendar-MayaAztec
   git checkout v0.0.2
   zef install .
   git switch -
   git checkout v0.0.1
   zef install .
   git switch -
   zef locate Date::Calendar::Aztec
   zef --installed list | grep Calendar
   -*-*-*-*- fin du script shell

Ensuite, je tente de créer une date en version 0.0.1 avec :

   -*-*-*-*- début du script Raku
   use Date::Calendar::Aztec:ver<0.0.1>;
   my Date $dg .= today;
   my Date::Calendar::Aztec $da .= new-from-date($dg);
   say $da.raku;
   -*-*-*-*- fin du script Raku

Le résultat est que l'objet $da comporte un attribut 'daycount', ce
qui prouve que c'est la version 0.0.2 et non pas la version 0.0.1.
Ajouter une clause ':ver<0.0.1>' à l'instruction 'use' signifie «
utiliser la version 0.0.1 **ou ultérieure** », comme en Perl.

Question 1 : comment peut-on écrire un programme de façon que ce soit
la version 0.0.1 qui soit utilisée et non pas la version 0.0.2 ?

Question 2 : est-il possible d'écrire un programme qui utilise les
deux versions du module ? Si oui, comment ?

Question 3 : en admettant une réponse affirmative à la question
précédente, comment peut-on identifier la version du module pour le
contenu d'une variable du programme ? Certes je peux poser une
question indirecte et tester l'existence de l'attribut 'daycount',
mais cela ne fonctionnera qu'avec le module de calendrier aztèque.
Plus généralement, comment faire pour poser une question directe et
obtenir un résultat '0.0.1' ou '0.0.2' ?

Lorsque j'essaie
   say $da.WHO;
j'obtiens uniquement :
   Date::Calendar::Aztec
et lorsque j'essaie
   say $da.WHAT;
j'obtiens un message d'erreur. Quant à
   say $da.VERSION;
(comme en Perl), j'obtiens un message d'erreur m'indiquant qu'il n'y a
pas de méthode 'VERSION'.

Et maintenant, réécrivons le passé et supposons que j'aie ajouté un
paramètre de classe 'api', ce qui aurait donné dans un cas :
   unit class Date::Calendar::Aztec:ver<0.0.1>:auth<cpan:JFORGET>:api<1>
et dans l'autre :
   unit class Date::Calendar::Aztec:ver<0.0.2>:auth<cpan:JFORGET>:api<2>

Question 4 : comment le paramètre ':api' fonctionne-t-il ?

Questions 5, 6 et 7 : est-ce que cela change quelque chose pour les
réponses 1, 2 et 3 ?

Pour mémoire, j'ai expérimenté dans une machine virtuelle Fedora 39
avec :

   -*-*-*- début du copier-coller
   jf at fedora:~$ raku -v
   Welcome to Rakudo™ v2024.04.
   Implementing the Raku® Programming Language v6.d.
   Built on MoarVM version 2024.04.
   jf at fedora:~$ zef --version
   0.21.4
   -*-*-*- fin du copier-coller

Merci d'avance pour vos lumières,

Jean F



Plus d'informations sur la liste de diffusion Perl