La première de l'année, la dernière à la Taverne
Un historique de toutes nos réunions
Nous avons mangé des blue-cheeseburgers, des magrets de canard, des pièces du boucher
saignantes,
des tartiflettes, des escalopes milanaises, des tartes au chocolat et des tartes Tatin.
Nous avons bu de la Beamish Red, de la 16, de la Desperado,
d'autres bières, une margarita et un gin fizz.
-
Olivier croyait que
Python
possédait un gros avantage sur
Perl,
à savoir la possibilité de surcharger les opérateurs
standards tels que « + » pour les faire
opérer sur des objets définis par l'utilisateur.
Il a même insisté sur ce point dans sa présentation de
Django
aux Journées Perl Francophones 2006
Or, en réunion, nous avons évoqué
use overload;
Enfin la vérité éclate, tout ce que Python fait de bien,
Perl le fait depuis longtemps.
-
Au sujet d'overload, je rappelle le conseil de
Damian Conway
dans
Perl Best Practices :
il est souhaitable d'utiliser overload uniquement
lorsque les deux opérations, la surchargeante et la surchargée
sont analogues. En pratique, si l'on veut surcharger
« + », « - » ou « * », il faudra
une classe d'objet qui s'interprête comme un nombre. Donc, en
pratique, cela n'est utile que pour les modules du genre
Math::BigInt
ou Math::BigFloat.
Olivier me donne l'exemple de l'opérateur d'itération
« <> » qui peut s'utiliser de multiples
façons sans avoir besoin de donner une interprétation numérique
à la classe associée.
-
L'un des exemples les plus célèbres d'overload vient de
C++.
C'est l'utilisation du décalage binaire pour coder les entrées-sorties,
par exemple :
cout << "Hello world." << '\n';
En fait, l'utilisation du « << » pour les sorties
est très bien connue des programmeurs
C++,
plus que le décalage
binaire. La véritable confusion se produira lorsqu'un programmeur
C++
atypique utilisera le décalage binaire pour une multiplication
par 2, 4 ou 8 :
bzzownt = flibadip << 2;
-
J'évoque le programme de racine carrée
que j'ai annoncé
aux Journées Perl 2005
et qui n'a toujours pas avancé depuis. La version que j'ai
annoncée était en fait la troisième mouture du programme.
La première version du programme était très mal agencée.
Le programme faisait un aller-retour constant entre le calcul numérique
pour savoir quels étaient les chiffres à utiliser et la gestion
de chaînes de caractères pour savoir où les écrire.
La deuxième version était un peu plus propre, dans la
mesure où j'utilisais une classe d'objets, lesquels
s'interprétaient tantôt en tant que chaînes de caractères,
tantôt en tant que valeurs numériques. Avec, évidemment,
la surcharge des quatre opérations arithmétiques.
Si cela a amélioré une portion du code, en revanche
ce n'était toujours pas très propre. En effet, le
programme sort au choix du texte simple, du texte
HTML ou bien une animation
Curses,
tout en prenant soin de ne pas planter si l'utilisateur
demande du texte simple ou du HTML sur un site où
Curses n'est pas installé.
En d'autres termes, il y a des
require
à l'intérieur d'eval,
une abomination. La troisième version sera sous la forme d'un
module, qui possède toutes les connaissances mathématiques,
et de quelques scripts, peu doués en mathématiques, mais
chacun spécialisé dans un format de sortie : texte,
HTML, Curses, Perl-Tk, etc.
Comme l'a bien compris Olivier, un point essentiel est de bien
définir une API entre le module et les scripts.
J'ajoute que le module sera, à terme, capable de calculer les
additions, les soustractions, les multiplications et les divisons.
Peut-être même, pourquoi pas, d'autres algorithmes comme le
calcul du PGCD par l'algorithme d'Euclide.
Pour utiliser l'algorithme, il faut commencer par
adapter le calcul de la division en mettant le quotient
au-dessus du diviseur et non pas en-dessous. Par exemple,
au lieu de :
12345|678 678|141 141|114 114|27 27|6 6|3
5565|18 114|4 27|1 06|3 3|4 0|2
141| | | | | |
on doit écrire
|18 |4 |1 |3 |4 |3
12345|678 678|141 141|114 114|27 27|6 6|2
5565| 114| 27| 06| 3| 0|
141| | | | | |
De la sorte, le quotient de la première division ne prend pas
la place destinée au reste de la deuxième division et ainsi de
suite. Il est alors possible d'obtenir la forme compacte suivante :
|18 |4 |1 |4 |4|2
12345|678|141|114|27|6|3
5565|114| 27| 06| 3|0|
141| | | | | |
-
Parmi les fonctionnalités de génie de Perl, Xavier
nous évoque également
tie
ainsi que
Perlio,
qui permet d'ajouter des filtres sur des flux en
entrée ou en sortie, sans avoir besoin d'effectuer des
fork.
Ces filtres peuvent être la conversion
de CRLF en LF, le transcodage d'UTF-8 en ISO-8859
parmi de nombreuses possibilités.
-
Parfois, les fonctionnalités de Perl se marchent
mutuellement sur les pieds. C'est ainsi que
Xavier a voulu utiliser
AutoLoader
dans un script qui utilisait également
CGI.
Or, ce dernier module fait abondamment appel au mécanisme
d'AUTOLOAD et est donc incompatible avec
AutoLoader.
-
Quelqu'un a demandé comment faire pour imprimer les éléments
d'un tableau, à raison de 10 par ligne. À vrai dire,
je ne vois pas comment faire sans passer par une boucle
for ou while. La boucle intérieure
peut être une boucle implicite avec un
join
ou un map
mais la boucle extérieure sera une boucle explicite.
-
Xavier nous a évoqué son module
Lemonldap::NG
et son rapport avec
LemonLDAP
d'Éric German (un participant à nos réunions il y a quelques années).
Il s'agit d'une réécriture complète du code. Notamment, Xavier
a soigné l'indentation de son code, alors qu'Éric n'y a pas accordé
beaucoup d'attention. On peut trouver parfois une indentation
inverse, du genre :
sub thlup {
my ($spazat) = @_;
print $spazat;
}
[ Cela dit, il existe d'autres cas, comme
CPAN::Mini,
où l'on obtient un phénomène semblable à cause des tabulations qui
sont réglées à 4 positions chez l'auteur du module et à 8 positions
dans mon éditeur et dans Search CPAN.]
-
Pour son module, celui avec « NG », Xavier a bénéficié
du contact avec Linagora. Par exemple, c'est sur leur suggestion
qu'il a ajouté la possibilité d'initialiser la base LDAP
avec des valeurs servant d'exemples. C'est bien simple (pour
les utilisateurs, pas pour lui), il suffit d'ajouter une dernière
étape après le make install :
make example
et c'est tout !
-
Lorsqu'une personne assiste à une réunion avec son ordinateur
portable et passe son temps à taper, nul doute qu'il porte
un soin particulier à conserver des notes sur la réunion...
Sauf si les notes qu'il tapent sont tout simplement de la
doc en format POD pour ses modules sur CPAN.
Un participant à la réunion nous a fait cet aveu.
-
J'ai repris avec Olivier l'explication que j'ai donnée
au mois de novembre
à Théo, au sujet de l'utilitaire que j'ai écrit en
Parse::Yapp.
Le langage utilisé dans mon travail utilise
les Call et les Goto, avec une
particularité : il est possible d'ajouter un
paramètre introduit par le mot-clé From
pour indiquer que l'étiquette de destination se trouve
dans un autre fichier. L'équivalent très approximatif
du :: de Perl. Un morceau typique de code
ressemble donc à ceci :
Call FLOBA_DAP(SKREECH + GWAP, ERR) From KABOOMM
If ERR
Goto KWOP
Endif
et dans le fichier KABOOMM.src
Subprog FLOBA_DAP(VALEUR, RC)
Value Integer VALEUR
Variable Integer RC
# etc.
sauf que nous n'utilisons pas
Acme::MetaSyntactic::donmartin
pour choisir nos identifiants. Pour revenir à nos moutons,
ma moulinette transforme ces portions de code en :
Call <a href='KABOOMM.html#FLOBA_DAP'>FLOBA_DAP</a>(SKREECH + GWAP, ERR) From <a href='KABOOMM.html'>KABOOMM</a>
If ERR
Goto <a href='#KWOP'>KWOP</a>
Endif
et pour le fichier KABOOMM.src
<a name='FLOBA_DAP'>Subprog FLOBA_DAP</a>(VALEUR, RC)
Value Integer VALEUR
Variable Integer RC
# etc.
Ma tâche a été facilitée par le fait que les appels à des
procédures sont des appels explicites par Call.
Le mot-clé Call n'existe à ma connaissance qu'en
COBOL.
Faux, me répond Olivier, c'était utilisé également
dans le shell de COMMAND.COM, lorsqu'un fichier
.bat demandait l'exécution d'un autre fichier
.bat. D'autre part, lorsque Microsoft est passé
à cmd.exe, le CALL a été utilisé également
pour des branchements à l'intérieur d'un même fichier de
commandes. Finalement, le CALL existe en
Visual Basic,
pour l'appel de procédures. Il est facultatif lorsque la procédure
requiert des paramètres (donc est facilement reconnaissable par
l'analyseur syntaxique grâce aux parenthèses) et il devient
obligatoire lorsque la procédure n'a pas de paramètre (donc difficile
à identifier s'il n'y avait ni parenthèses ni CALL).
-
Il a été question de la recherche d'un emploi et de
la tentation de pipeauter son interlocuteur pendant
l'entretien. Cela me rappelle
une discussion
sur fr.comp.lang.perl
où quelqu'un demandait comment faire croire à son recruteur
qu'il connaissait très bien Perl. Il n'avait reçu que
des réponses négatives. L'une d'elles émanait de Rafael
qui lui demandait s'il avait posté sa demande sous
sa véritable identité. En effet, il y a de fortes chances
que le recruteur fasse une recherche sur Internet
pour avoir une première idée de l'individu qu'il va
interroger...
HTML 5 - CSS v3
Mongueurs de Paris, le 4 juillet 2018
Copyright © The Paris Perl Mongers, 1999-2024