Il y a des fonctionnalités qu’on n’attendait pas forcément, mais qui une fois en place semblent tellement naturelles qu’on se demande comment on faisait sans. L’opérateur --> est de celles-là.
Le problème de départ
En MOGWAI, la façon classique de transformer une valeur stockée dans une variable, c’est de la poser sur la pile, d’appliquer les transformations voulues, puis de stocker le résultat :
"bonjour" -> 'A'
A ->upper butfirst butlast -> 'A'
# A contient maintenant "ONJOU"
Ça fonctionne parfaitement, et pour des chaînes ou des petites valeurs c’est tout à fait adapté. Mais MOGWAI propose aussi le préfixe & pour travailler directement sur le contenu d’une variable, sans créer de copie intermédiaire. C’est particulièrement utile avec des listes volumineuses, où cloner la valeur à chaque opération a un coût réel.
Avec &, la mutation se fait en place :
"bonjour" -> 'A'
&A ->upper
# A contient maintenant "BONJOUR" — sans copie
C’est efficace. Mais si on veut enchaîner plusieurs transformations, ça devient rapidement verbeux :
&A ->upper &A butfirst &A butlast
# A contient maintenant "ONJOU"
Répéter &A avant chaque opération, c’est du bruit. Et du bruit, c’est du code moins lisible, plus difficile à maintenir.
L’opérateur -->
La v8.4 introduit -->, qui permet d’exprimer ce pipeline en une seule expression claire :
(->upper butfirst butlast) --> &A
On lit ça de gauche à droite : * »applique ces transformations à A, en place »*. La liste entre parenthèses contient les opérations dans l’ordre, et --> les exécute l’une après l’autre sur la variable référencée.
Le résultat est identique à la version répétitive, mais l’intention est immédiatement lisible.
La conception derrière l’opérateur
Ce qui est intéressant ici, c’est que --> ne réinvente rien. Il s’appuie entièrement sur les mécanismes existants du langage.
Quand le parseur rencontre (->upper butfirst butlast) --> &A, il réécrit l’expression en RPN pur, exactement comme il le fait pour les autres sucres syntaxiques de MOGWAI. Aucune magie à l’exécution — juste une transformation de notation.
Pour chaque item de la liste, l’opérateur travaille sur une pile privée initialisée avec la valeur directe de A. Cette isolation est importante : peu importe ce que fait un item en interne sur la pile, ça ne pollue jamais la pile globale. Et puisqu’on travaille avec la référence &A, les modifications sont immédiatement répercutées dans la variable — pas de copie, pas de « write back ».
Les quotations dans le pipeline
La liste peut contenir non seulement des fonctions simples, mais aussi des quotations — des blocs de code { }. C’est là que l’opérateur devient vraiment expressif.
Imaginez que vous vouliez transformer une chaîne tout en capturant une information au passage :
"hello world" -> 'A'
(->upper { dup size -> 'len' } { " !" + }) --> &A
# A contient "HELLO WORLD !"
# len contient 11 (la taille avant ajout du suffixe)
La quotation reçoit la valeur courante de A sur sa pile privée, fait ce qu’elle a à faire, et laisse le résultat pour la suite du pipeline. C’est flexible, sans complexifier le modèle d’exécution.
Un pipeline qui ne laisse pas de mauvaises surprises
Un point de conception auquel on pense rarement au premier abord : que se passe-t-il si une opération échoue en cours de route ?
Sans protection particulière, la variable serait laissée dans un état partiel — transformée jusqu’à l’étape qui a planté. C’est le genre de situation qui génère des bugs difficiles à tracer.
L’opérateur --> est transactionnel : avant de démarrer le pipeline, un snapshot de la variable est pris. Si une erreur survient à n’importe quelle étape, la variable est automatiquement restaurée dans son état d’origine, et l’erreur est propagée normalement.
"bonjour" -> 'A'
guard
{
(->upper sqrt butlast) --> &A
# sqrt n'est pas applicable à une chaîne → erreur
}
else
{
A ? # affiche "bonjour" — restauré automatiquement
}
Ce comportement évite les états incohérents sans que le développeur ait à gérer manuellement une sauvegarde. Le pipeline réussit complètement, ou il ne change rien.
En résumé
L’opérateur --> est une addition modeste en apparence, mais soignée dans ses détails :
- Syntaxe lisible et cohérente avec les conventions de MOGWAI
- Pile privée isolée pour chaque étape — pas d’effet de bord sur la pile globale
- Mutation directe via
&— pas de copie intermédiaire inutile - Comportement transactionnel — la variable est toujours dans un état cohérent
- Quotations acceptées — expressivité complète dans le pipeline
C’est le genre de fonctionnalité qui ne fait pas les gros titres, mais qui améliore concrètement le quotidien d’écriture du code. Et ça, c’est souvent ce qui compte le plus.
MOGWAIv8.3 est disponible sur NuGet et le Playground en ligne vous permet de tester directement dans votre navigateur. L’opérateur --> sera disponible dès la v8.4.