{"id":1941,"date":"2026-03-19T17:09:21","date_gmt":"2026-03-19T16:09:21","guid":{"rendered":"https:\/\/coding4phone.com\/?p=1941"},"modified":"2026-03-30T20:39:49","modified_gmt":"2026-03-30T19:39:49","slug":"mogwai-v8-4-loperateur-pour-transformer-une-variable-en-place-proprement","status":"publish","type":"post","link":"https:\/\/coding4phone.com\/?p=1941","title":{"rendered":"MOGWAI  \u2014 L&rsquo;op\u00e9rateur &#8211;> pour transformer une variable en place, proprement"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\" id=\"mogwai-v84--land39operateur---andgt--transformer-une-variable-en-place-proprement\">Il y a des fonctionnalit\u00e9s qu&rsquo;on n&rsquo;attendait pas forc\u00e9ment, mais qui une fois en place semblent tellement naturelles qu&rsquo;on se demande comment on faisait sans. L&rsquo;op\u00e9rateur <code>--&gt;<\/code> est de celles-l\u00e0.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"le-probleme-de-depart\">Le probl\u00e8me de d\u00e9part<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En <a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a>, la fa\u00e7on classique de transformer une valeur stock\u00e9e dans une variable, c&rsquo;est de la poser sur la pile, d&rsquo;appliquer les transformations voulues, puis de stocker le r\u00e9sultat :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"bonjour\" -&gt; 'A'<br>A -&gt;upper butfirst butlast -&gt; 'A'<br># A contient maintenant \"ONJOU\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c7a fonctionne parfaitement, et pour des cha\u00eenes ou des petites valeurs c&rsquo;est tout \u00e0 fait adapt\u00e9. Mais <a href=\"https:\/\/www.mogwai.eu.com\" data-type=\"link\" data-id=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> propose aussi le pr\u00e9fixe <code>&amp;<\/code> pour travailler <strong>directement<\/strong> sur le contenu d&rsquo;une variable, sans cr\u00e9er de copie interm\u00e9diaire. C&rsquo;est particuli\u00e8rement utile avec des listes volumineuses, o\u00f9 cloner la valeur \u00e0 chaque op\u00e9ration a un co\u00fbt r\u00e9el.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Avec <code>&amp;<\/code>, la mutation se fait en place :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"bonjour\" -&gt; 'A'<br>&amp;A -&gt;upper<br># A contient maintenant \"BONJOUR\" \u2014 sans copie<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est efficace. Mais si on veut encha\u00eener plusieurs transformations, \u00e7a devient rapidement verbeux :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&amp;A -&gt;upper  &amp;A butfirst  &amp;A butlast<br># A contient maintenant \"ONJOU\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e9p\u00e9ter <code>&amp;A<\/code> avant chaque op\u00e9ration, c&rsquo;est du bruit. Et du bruit, c&rsquo;est du code moins lisible, plus difficile \u00e0 maintenir.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"land39operateur---andgt\">L&rsquo;op\u00e9rateur <strong>&#8211;><\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La v8.4 introduit <code>--&gt;<\/code>, qui permet d&rsquo;exprimer ce pipeline en une seule expression claire :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">(-&gt;upper butfirst butlast) --&gt; &amp;A<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On lit \u00e7a de gauche \u00e0 droite : \u00ab\u00a0applique ces transformations \u00e0 A, en place\u00a0\u00bb. La liste entre parenth\u00e8ses contient les op\u00e9rations dans l&rsquo;ordre, et <code>--&gt;<\/code> les ex\u00e9cute l&rsquo;une apr\u00e8s l&rsquo;autre sur la variable r\u00e9f\u00e9renc\u00e9e.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le r\u00e9sultat est identique \u00e0 la version r\u00e9p\u00e9titive, mais l&rsquo;intention est imm\u00e9diatement lisible.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"la-conception-derriere-land39operateur\">La conception derri\u00e8re l&rsquo;op\u00e9rateur<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ce qui est int\u00e9ressant ici, c&rsquo;est que <code>--&gt;<\/code> ne r\u00e9invente rien. Il s&rsquo;appuie enti\u00e8rement sur les m\u00e9canismes existants du langage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quand le parseur rencontre <code>(-&gt;upper butfirst butlast) --&gt; &amp;A<\/code>, il r\u00e9\u00e9crit l&rsquo;expression en RPN pur, exactement comme il le fait pour les autres sucres syntaxiques de <a href=\"https:\/\/www.mogwai.eu.com\" data-type=\"link\" data-id=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a>. Aucune magie \u00e0 l&rsquo;ex\u00e9cution \u2014 juste une transformation de notation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour chaque item de la liste, l&rsquo;op\u00e9rateur travaille sur une <strong>pile priv\u00e9e<\/strong> initialis\u00e9e avec la valeur directe de <code>A<\/code>. Cette isolation est importante : peu importe ce que fait un item en interne sur la pile, \u00e7a ne pollue jamais la pile globale. Et puisqu&rsquo;on travaille avec la r\u00e9f\u00e9rence <code>&amp;A<\/code>, les modifications sont imm\u00e9diatement r\u00e9percut\u00e9es dans la variable \u2014 pas de copie, pas de \u00ab\u00a0write back\u00a0\u00bb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"les-quotations-dans-le-pipeline\">Les quotations dans le pipeline<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La liste peut contenir non seulement des fonctions simples, mais aussi des <strong>quotations<\/strong> \u2014 des blocs de code <code>{ }<\/code>. C&rsquo;est l\u00e0 que l&rsquo;op\u00e9rateur devient vraiment expressif.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Imaginez que vous vouliez transformer une cha\u00eene tout en capturant une information au passage :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"hello world\" -&gt; 'A'<br>(-&gt;upper { dup size -&gt; 'len' } { \" !\" + }) --&gt; &amp;A<br># A contient \"HELLO WORLD !\"<br># len contient 11 (la taille avant ajout du suffixe)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La quotation re\u00e7oit la valeur courante de <code>A<\/code> sur sa pile priv\u00e9e, fait ce qu&rsquo;elle a \u00e0 faire, et laisse le r\u00e9sultat pour la suite du pipeline. C&rsquo;est flexible, sans complexifier le mod\u00e8le d&rsquo;ex\u00e9cution.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"un-pipeline-qui-ne-laisse-pas-de-mauvaises-surprises\">Un pipeline qui ne laisse pas de mauvaises surprises<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Un point de conception auquel on pense rarement au premier abord : que se passe-t-il si une op\u00e9ration \u00e9choue en cours de route ?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sans protection particuli\u00e8re, la variable serait laiss\u00e9e dans un \u00e9tat partiel \u2014 transform\u00e9e jusqu&rsquo;\u00e0 l&rsquo;\u00e9tape qui a plant\u00e9. C&rsquo;est le genre de situation qui g\u00e9n\u00e8re des bugs difficiles \u00e0 tracer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;op\u00e9rateur <code>--&gt;<\/code> est <strong>transactionnel<\/strong> : avant de d\u00e9marrer le pipeline, un snapshot de la variable est pris. Si une erreur survient \u00e0 n&rsquo;importe quelle \u00e9tape, la variable est automatiquement restaur\u00e9e dans son \u00e9tat d&rsquo;origine, et l&rsquo;erreur est propag\u00e9e normalement.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"bonjour\" -&gt; 'A'<br><br>guard<br>{<br>    (-&gt;upper sqrt butlast) --&gt; &amp;A<br>    # sqrt n'est pas applicable \u00e0 une cha\u00eene \u2192 erreur<br>}<br>else<br>{<br>    A ?  # affiche \"bonjour\" \u2014 restaur\u00e9 automatiquement<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ce comportement \u00e9vite les \u00e9tats incoh\u00e9rents sans que le d\u00e9veloppeur ait \u00e0 g\u00e9rer manuellement une sauvegarde. Le pipeline r\u00e9ussit compl\u00e8tement, ou il ne change rien.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"en-resume\">En r\u00e9sum\u00e9<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;op\u00e9rateur <code>--&gt;<\/code> est une addition modeste en apparence, mais soign\u00e9e dans ses d\u00e9tails :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Syntaxe lisible et coh\u00e9rente avec les conventions de <a href=\"https:\/\/www.mogwai.eu.com\" data-type=\"link\" data-id=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a><\/li>\n\n\n\n<li>Pile priv\u00e9e isol\u00e9e pour chaque \u00e9tape \u2014 pas d&rsquo;effet de bord sur la pile globale<\/li>\n\n\n\n<li>Mutation directe via <code>&amp;<\/code> \u2014 pas de copie interm\u00e9diaire inutile<\/li>\n\n\n\n<li>Comportement transactionnel \u2014 la variable est toujours dans un \u00e9tat coh\u00e9rent<\/li>\n\n\n\n<li>Quotations accept\u00e9es \u2014 expressivit\u00e9 compl\u00e8te dans le pipeline<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est le genre de fonctionnalit\u00e9 qui ne fait pas les gros titres, mais qui am\u00e9liore concr\u00e8tement le quotidien d&rsquo;\u00e9criture du code. Et \u00e7a, c&rsquo;est souvent ce qui compte le plus.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.mogwai.eu.com\" data-type=\"link\" data-id=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a><em>v8.3 est disponible sur <a href=\"https:\/\/www.nuget.org\/packages\/MOGWAI\">NuGet<\/a> et le <a href=\"https:\/\/playground.mogwai.eu.com\">Playground en ligne<\/a> vous permet de tester directement dans votre navigateur. L&rsquo;op\u00e9rateur <code>--&gt;<\/code> sera disponible d\u00e8s la v8.4.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&rsquo;op\u00e9rateur &#8211;> introduit dans MOGWAI v8.4 permet d&rsquo;appliquer plusieurs transformations sur une variable en place, avec une syntaxe claire et sans copiage interm\u00e9diaire. Il offre une gestion transactionnelle des erreurs, garantissant un \u00e9tat coh\u00e9rent des variables.<\/p>\n","protected":false},"author":1,"featured_media":1950,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"D\u00e9couvrez l'op\u00e9rateur `-->` de MOGWAI : facilitez vos transformations en place de variables tout en garantissant une syntaxe claire et lisible.","jetpack_seo_html_title":"L'op\u00e9rateur `-->` dans MOGWAI : Simplifiez votre code","jetpack_seo_noindex":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[8,6,48,50],"tags":[13,21],"class_list":["post-1941","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-mogwai","category-rpn","category-scripting","tag-dotnet","tag-mogwai"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/03\/create-a-highly-detailed-and-sharp-focused-image-that-visually-represents-1.png?fit=1024%2C768&ssl=1","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfoe4s-vj","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/1941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1941"}],"version-history":[{"count":10,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/1941\/revisions"}],"predecessor-version":[{"id":2097,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/1941\/revisions\/2097"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/media\/1950"}],"wp:attachment":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}