{"id":2016,"date":"2026-03-20T17:31:37","date_gmt":"2026-03-20T16:31:37","guid":{"rendered":"https:\/\/coding4phone.com\/?p=2016"},"modified":"2026-03-20T17:31:39","modified_gmt":"2026-03-20T16:31:39","slug":"affectation-dynamique-de-variables-dans-mogwai","status":"publish","type":"post","link":"https:\/\/coding4phone.com\/?p=2016","title":{"rendered":"Affectation dynamique de variables dans MOGWAI"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Sans eval, sans dictionnaire \u2014 juste la stack.<\/em><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>S\u00e9rie<\/strong> : <a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> Deep Dive \u00b7 v8.3 \u00b7 coding4phone.com<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">La plupart des langages de script qui supportent le nommage dynamique de variables s&rsquo;appuient sur <code>eval<\/code> \u2014 un outil brutal qui ex\u00e9cute une cha\u00eene arbitraire comme du code. \u00c7a fonctionne, mais c&rsquo;est opaque, souvent risqu\u00e9, et philosophiquement incompatible avec un syst\u00e8me de types coh\u00e9rent. D&rsquo;autres langages vous poussent vers des dictionnaires ou de la r\u00e9flexion, au prix de verbosit\u00e9 et d&rsquo;indirection.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> prend une voie diff\u00e9rente. Parce que c&rsquo;est un langage RPN orient\u00e9 stack, <strong>donn\u00e9es et code coexistent naturellement sur la pile<\/strong> \u2014 et le nommage dynamique devient une composition propre de trois petites primitives. Pas de magie. Pas d&rsquo;\u00e9chappatoire. Juste la stack, qui fait son travail.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"le-pattern-en-un-coup-dand39\u0153il\">Le pattern en un coup d&rsquo;\u0153il<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Voici un exemple concret : cr\u00e9er 1 000 variables nomm\u00e9es <code>$V1<\/code> \u00e0 <code>$V1000<\/code>, chacune contenant un entier al\u00e9atoire entre 0 et 99.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">1 1000 for 'i' do {<br>    rand 100 * ->int<br>    -> { ! \"$V\" i + ->name }<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">D\u00e9cortiquons cela \u00e9tape par \u00e9tape.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"execution-pas-a-pas\">Ex\u00e9cution pas \u00e0 pas<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"1--produire-la-valeur\">1 \u2014 Produire la valeur<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">rand 100 * ->int<\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u00c9tape<\/th><th>Stack<\/th><th>Note<\/th><\/tr><\/thead><tbody><tr><td><code>rand<\/code><\/td><td><code>0.731\u2026<\/code><\/td><td>float \u2208 [0, 1[<\/td><\/tr><tr><td><code>100 *<\/code><\/td><td><code>73.1\u2026<\/code><\/td><td>mis \u00e0 l&rsquo;\u00e9chelle [0, 100[<\/td><\/tr><tr><td><code>-&gt;int<\/code><\/td><td><code>73<\/code><\/td><td>entier \u2208 [0, 99]<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Rien de surprenant \u2014 une s\u00e9quence RPN classique qui laisse l&rsquo;entier al\u00e9atoire sur la stack.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"2--construire-le-nom-de-variable\">2 \u2014 Construire le nom de variable<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">{ ! \"$V\" i + ->name }<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est le c\u0153ur du pattern. L&rsquo;op\u00e9rateur <strong><code>!<\/code><\/strong> en t\u00eate du bloc demande \u00e0 <a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> d&rsquo;<em>auto-\u00e9valuer<\/em> le bloc imm\u00e9diatement, au lieu de le pousser sur la stack comme un objet appelable. Le moteur ex\u00e9cute donc le corps du bloc en ligne :<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u00c9tape<\/th><th>Stack<\/th><th>Note<\/th><\/tr><\/thead><tbody><tr><td><code>\"$V\"<\/code><\/td><td><code>\"$V\"<\/code><\/td><td>une simple cha\u00eene<\/td><\/tr><tr><td><code>i<\/code><\/td><td><code>\"$V\" 5<\/code><\/td><td>compteur de boucle<\/td><\/tr><tr><td><code>+<\/code><\/td><td><code>\"$V5\"<\/code><\/td><td>concat\u00e9nation de cha\u00eenes<\/td><\/tr><tr><td><code>-&gt;name<\/code><\/td><td><code>'$V5'<\/code><\/td><td>cha\u00eene \u2192 nom de variable<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">La transition cl\u00e9 est <strong><code>->name<\/code><\/strong> : elle convertit la cha\u00eene <code>\"$V5\"<\/code> \u2014 une donn\u00e9e \u2014 en le nom <code>'$V5'<\/code> \u2014 une r\u00e9f\u00e9rence symbolique. Ce sont deux types distincts dans <a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a>. Pas de coercition implicite, pas de surprise : on franchit la fronti\u00e8re explicitement, d\u00e9lib\u00e9r\u00e9ment.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"3--land39affectation\">3 \u2014 L&rsquo;affectation<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">-><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dans <a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a>, l&rsquo;op\u00e9rateur <code>-><\/code> est du sucre syntaxique pour <code>STO<\/code>. Il d\u00e9pile un nom au sommet de la stack et la valeur juste en dessous, et stocke la valeur sous ce nom. \u00c0 ce stade la stack contient :<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Moment<\/th><th>Stack<\/th><th>Note<\/th><\/tr><\/thead><tbody><tr><td>avant <code>-&gt;<\/code><\/td><td><code>73 '$V5'<\/code><\/td><td>valeur puis nom, nom au sommet<\/td><\/tr><tr><td>apr\u00e8s <code>-&gt;<\/code><\/td><td><em>(vide)<\/em><\/td><td>73 stock\u00e9 dans $V5<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ce qui est \u00e9quivalent \u00e0 : <code>73 '$V5' STO<\/code>. La stack est propre, la variable existe, on passe \u00e0 l&rsquo;it\u00e9ration suivante.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"pourquoi-cand39est-important\">Pourquoi c&rsquo;est important<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dans de nombreux langages, le nommage dynamique de variables oblige \u00e0 recourir \u00e0 un \u00e9chappatoire. Comparons :<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Autres langages<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">eval(f\"V{i} = {val}\")   # Python \u2014 risqu\u00e9, opaque<br><br># ou contournement par dictionnaire :<br>d = {}<br>d[f\"V{i}\"] = val        # indirect, plus vraiment des variables<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">val -> { ! \"$V\" i + ->name }<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>eval<\/code> est puissant mais dangereux \u2014 il ex\u00e9cute du code arbitraire, court-circuite toute analyse statique et est impossible \u00e0 raisonner formellement. Le contournement par dictionnaire est s\u00fbr mais indirect : on ne travaille plus vraiment avec des variables, on compense leur absence.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;approche <a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> est <strong>explicite<\/strong> et <strong>composable<\/strong> : on construit le nom comme une donn\u00e9e, on le promeus en r\u00e9f\u00e9rence symbolique avec <code>->name<\/code>, et on le passe \u00e0 <code>-><\/code> comme n&rsquo;importe quel autre nom. La stack est le seul medium. Chaque \u00e9tape est visible, tra\u00e7able, et debuggable dans MOGWAI Studio.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Insight cl\u00e9<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ce pattern est une expression de l&rsquo;<strong>homo\u00efconicit\u00e9 sur la stack<\/strong>. Donn\u00e9es et noms coexistent dans le m\u00eame espace. La fronti\u00e8re entre eux n&rsquo;est pas dissoute \u2014 elle est franchissable d\u00e9lib\u00e9r\u00e9ment, une primitive \u00e0 la fois. C&rsquo;est ce que <a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> h\u00e9rite de la tradition HP RPL.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"les-trois-primitives\">Les trois primitives<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tout le pattern repose sur trois briques :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>!<\/code><\/strong> \u2014 auto-\u00e9value un bloc imm\u00e9diatement, int\u00e9grant son ex\u00e9cution dans le flux courant.<\/li>\n\n\n\n<li><strong><code>->name<\/code><\/strong> \u2014 promeut une cha\u00eene en nom de variable, franchissant explicitement la fronti\u00e8re donn\u00e9e\/r\u00e9f\u00e9rence.<\/li>\n\n\n\n<li><strong><code>-><\/code><\/strong> \u2014 stocke une valeur sous un nom (<code>STO<\/code>), consommant les deux depuis la stack.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Chaque primitive est simple et g\u00e9n\u00e9rique. Aucune n&rsquo;a \u00e9t\u00e9 con\u00e7ue sp\u00e9cifiquement pour le nommage dynamique \u2014 et pourtant leur composition produit exactement cette capacit\u00e9. C&rsquo;est en tout cas l&rsquo;id\u00e9al vis\u00e9 : une puissance qui <em>\u00e9merge<\/em> de primitives coh\u00e9rentes, et non de cas sp\u00e9ciaux.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"applications-pratiques\">Applications pratiques<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le pattern est le plus utile dans les contextes de scripting g\u00e9n\u00e9rique : g\u00e9n\u00e9ration de donn\u00e9es de test (comme illustr\u00e9 ci-dessus), moteurs de templates, scaffolding de configuration, ou tout sc\u00e9nario o\u00f9 les noms de variables ne sont pas connus \u00e0 l&rsquo;\u00e9criture mais suivent une structure pr\u00e9visible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans les projets m\u00e9tier typiques, les structures de donn\u00e9es sont souvent fixes et bien d\u00e9finies \u2014 ce pattern n&rsquo;est donc pas forc\u00e9ment sollicit\u00e9 au quotidien. Mais il est l\u00e0, disponible, pour le jour o\u00f9 un script devra construire son propre espace de nommage \u00e0 la vol\u00e9e.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est la valeur silencieuse d&rsquo;un langage bien compos\u00e9 : on n&rsquo;utilise pas forc\u00e9ment chaque pattern chaque jour, mais quand le besoin se pr\u00e9sente, les outils sont d\u00e9j\u00e0 l\u00e0 \u2014 propres, composables, et exactement o\u00f9 on les attend.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><em><a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> \u2014 open source depuis f\u00e9vrier 2026 \u00b7 <a href=\"https:\/\/github.com\">GitHub<\/a> \u00b7 coding4phone.com<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>MOGWAI, un langage RPN, permet un nommage dynamique de variables sans eval ni dictionnaire. Il utilise trois primitives simples pour garantir clart\u00e9, s\u00e9curit\u00e9 et tra\u00e7abilit\u00e9 dans la gestion de la stack.<\/p>\n","protected":false},"author":1,"featured_media":2024,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":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":true,"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],"tags":[],"class_list":["post-2016","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-mogwai"],"jetpack_publicize_connections":[],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfoe4s-ww","jetpack-related-posts":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/03\/image-4.png?fit=1024%2C768&ssl=1","_links":{"self":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2016","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=2016"}],"version-history":[{"count":8,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2016\/revisions"}],"predecessor-version":[{"id":2025,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2016\/revisions\/2025"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/media\/2024"}],"wp:attachment":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2016"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2016"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2016"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}