{"id":1901,"date":"2026-03-17T12:41:01","date_gmt":"2026-03-17T11:41:01","guid":{"rendered":"https:\/\/coding4phone.com\/?p=1901"},"modified":"2026-03-19T16:50:53","modified_gmt":"2026-03-19T15:50:53","slug":"mogwai-sous-le-capot-sucre-syntaxique-et-forme-canonique-rpn","status":"publish","type":"post","link":"https:\/\/coding4phone.com\/?p=1901","title":{"rendered":"MOGWAI sous le capot : sucre syntaxique et forme canonique RPN"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\" id=\"mogwai-sous-le-capot--sucre-syntaxique-et-forme-canonique-rpn\">Il y a un moment que tout concepteur de langage \u00e0 pile redoute. Vous ouvrez un script \u00e9crit trois semaines plus t\u00f4t, et il ressemble \u00e0 \u00e7a :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">code size 'code_len' STO 0 @code_len 1 - 'i' {\"_\" code @i 1 sub char-> ->str + ->key} FOR<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Parfaitement valide. Parfaitement ex\u00e9cutable. Compl\u00e8tement illisible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est la tension classique des langages RPN : le paradigme est \u00e9l\u00e9gant et coh\u00e9rent \u00e0 l&rsquo;ex\u00e9cution, mais na\u00efvement \u00e9crit, il devient du code en \u00e9criture seule \u2014 m\u00eame pour son propre auteur. <a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> r\u00e9pond \u00e0 ce probl\u00e8me frontalement avec une couche de sucre syntaxique qui rend les scripts lisibles sans compromettre la puret\u00e9 du mod\u00e8le d&rsquo;ex\u00e9cution sous-jacent.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"deux-mondes-un-seul-langage\">Deux mondes, un seul langage<\/h2>\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> est, dans son essence, un langage \u00e0 pile RPN. Chaque op\u00e9ration consomme des valeurs depuis la pile et y repousse ses r\u00e9sultats. Fonctions, structures de contr\u00f4le, affectations \u2014 tout ob\u00e9it \u00e0 la m\u00eame r\u00e8gle : poser les arguments d&rsquo;abord, puis appeler le mot qui les traite.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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> dispose aussi d&rsquo;un parser, et ce parser sait traduire une syntaxe de surface plus lisible vers la forme RPN canonique que le runtime ex\u00e9cute r\u00e9ellement. Ce sont deux couches distinctes, et comprendre la fronti\u00e8re entre elles est la cl\u00e9 pour comprendre le langage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Passons en revue les principales transformations.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"definir-une-fonction\">D\u00e9finir une fonction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dans la forme source, une d\u00e9finition de fonction ressemble \u00e0 ceci :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">to 'greet' with [name: .string] do<br>{<br>    \"Hello, \" @name + ??<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est lisible. On voit imm\u00e9diatement que <code>greet<\/code> prend un param\u00e8tre cha\u00eene appel\u00e9 <code>name<\/code>, et que son corps concat\u00e8ne un message de salutation et l&rsquo;affiche. Apr\u00e8s parsing, le m\u00eame code devient :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u00ab[name: .string] ->safeVars \"Hello, \" @name + ??\u00bb 'greet' DEFUNC<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le sucre <code>to ... with ... do<\/code> a disparu. \u00c0 sa place : un objet programme <code>\u00ab \u00bb<\/code>, suivi du nom de la fonction et du mot <code>DEFUNC<\/code>. <code>DEFUNC<\/code> consomme les deux depuis la pile et enregistre la fonction.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;instruction <code>-&gt;safeVars<\/code>, ins\u00e9r\u00e9e automatiquement par le parser juste apr\u00e8s le record de param\u00e8tres, n&rsquo;est pas de la simple plomberie. C&rsquo;est le mot qui valide et lie les arguments entrants selon la signature d\u00e9clar\u00e9e \u2014 ici, en v\u00e9rifiant que <code>name<\/code> est bien un <code>.string<\/code>. Sans elle, le record <code>[name: .string]<\/code> ne serait qu&rsquo;une valeur d\u00e9corative pos\u00e9e sur la pile sans aucun effet. C&rsquo;est <code>-&gt;safeVars<\/code> qui rend la d\u00e9claration de param\u00e8tres r\u00e9ellement effective : la v\u00e9rification de type se produit \u00e0 l&rsquo;appel, pas au parsing, et tout \u00e9cart est intercept\u00e9 avant m\u00eame que le corps de la fonction commence \u00e0 s&rsquo;ex\u00e9cuter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Remarquez les d\u00e9limiteurs <code>\u00ab \u00bb<\/code> \u2014 un h\u00e9ritage direct des calculatrices RPL de HP. Ce ne sont pas de simples crochets d\u00e9coratifs. Un bloc <code>\u00ab \u00bb<\/code> cr\u00e9e son propre scope de variables locales : les variables d\u00e9finies \u00e0 l&rsquo;int\u00e9rieur ne peuvent pas s&rsquo;en \u00e9chapper, et la fonction d\u00e9marre dans un environnement propre \u00e0 chaque appel. C&rsquo;est fondamentalement diff\u00e9rent d&rsquo;un simple bloc <code>{ }<\/code>, qui ne cr\u00e9e pas de nouveau scope et partage le contexte de variables de son appelant. La distinction est importante : les blocs <code>{ }<\/code> sont des quotations \u2014 des valeurs que l&rsquo;on peut manipuler, stocker dans un dictionnaire ou passer \u00e0 une structure de contr\u00f4le. Les blocs <code>\u00ab \u00bb<\/code> sont des programmes \u2014 des contextes d&rsquo;ex\u00e9cution isol\u00e9s.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"affecter-des-variables\">Affecter des variables<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La forme source utilise l&rsquo;op\u00e9rateur fl\u00e8che :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">now -> 'begin'<br>code size -> 'code_len'<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Apr\u00e8s parsing :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">now 'begin' STO<br>code size 'code_len' STO<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;op\u00e9rateur <code>-&gt;<\/code> est du sucre pur pour <code>STO<\/code>. Le parser inverse simplement l&rsquo;ordre \u2014 dans la source, la valeur vient en premier, puis la fl\u00e8che, puis le nom de la variable. Dans la forme canonique, la valeur et le nom sont tous deux sur la pile avant que <code>STO<\/code> soit appel\u00e9. M\u00eame s\u00e9mantique, lisibilit\u00e9 diff\u00e9rente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"les-structures-de-controle\">Les structures de contr\u00f4le<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est l\u00e0 que le sucre justifie le plus sa pr\u00e9sence.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"la-boucle-while\">La boucle <code>while<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Forme source :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">while (@code_ptr @code_len &lt;) do<br>{<br>    &amp;dispatch @code_ptr get eval<br>    'code_ptr' ++<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Forme canonique :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{@code_ptr @code_len &lt;}<br>{&amp;dispatch @code_ptr get eval 'code_ptr' ++}<br>WHILE<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La syntaxe <code>while ... do { }<\/code> encadre la condition et le corps dans des blocs explicites et lisibles. Apr\u00e8s parsing, les deux deviennent des quotations sur la pile, et <code>WHILE<\/code> les consomme. Le runtime \u00e9value la quotation de condition de mani\u00e8re r\u00e9p\u00e9t\u00e9e ; tant qu&rsquo;elle laisse une valeur vraie sur la pile, il \u00e9value la quotation du corps.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"le-conditionnel-if\">Le conditionnel <code>if<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Forme source :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">if (@cell_ptr 0 >) then<br>{<br>    'cell_ptr' --<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Forme canonique :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{! @cell_ptr 0 >}<br>{'cell_ptr' --}<br>IF<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il y a quelque chose de subtil ici : le <code>!<\/code> en d\u00e9but de bloc de condition. Ce marqueur indique au runtime d&rsquo;<em>auto-\u00e9valuer<\/em> le bloc plut\u00f4t que de simplement le poser sur la pile comme une quotation. Sans lui, <code>{@cell_ptr 0 &gt;}<\/code> resterait sur la pile comme une valeur, et il faudrait appeler <code>eval<\/code> explicitement ensuite. Avec <code>!<\/code>, le bloc s&rsquo;auto-\u00e9value au moment o\u00f9 il est rencontr\u00e9, produisant le r\u00e9sultat bool\u00e9en qu&rsquo;<code>IF<\/code> attend. C&rsquo;est un token minuscule avec un r\u00f4le pr\u00e9cis : il condense le pattern poser-puis-\u00e9valuer en une seule \u00e9tape.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"la-boucle-for\">La boucle <code>for<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Forme source :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">0 @code_len 1 - for 'i' do<br>{<br>    \"_\" code @i 1 sub char-> ->str + ->key<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Forme canonique :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">0 @code_len 1 - 'i'<br>{\"_\" code @i 1 sub char-> ->str + ->key}<br>FOR<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Les bornes de la boucle (<code>0<\/code> \u00e0 <code>@code_len 1 -<\/code>) et le nom de la variable d&rsquo;it\u00e9ration (<code>'i'<\/code>) sont pouss\u00e9s sur la pile, suivis de la quotation du corps, suivie de <code>FOR<\/code>. Propre et m\u00e9canique.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ce-qui-disparait-au-passage\">Ce qui dispara\u00eet au passage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La forme canonique rend une chose \u00e9vidente : les commentaires et les espaces disparaissent compl\u00e8tement. Le r\u00e9sultat du parsing est un flux de tokens plat et lin\u00e9aire \u2014 pas d&rsquo;indentation, pas de lignes vides, pas de <code># explications<\/code>. Le runtime n&rsquo;en a pas besoin. C&rsquo;est quelque chose \u00e0 garder \u00e0 l&rsquo;esprit quand on \u00e9crit du <a href=\"https:\/\/www.mogwai.eu.com\" data-type=\"link\" data-id=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> : le fichier source est pour les humains, la forme pars\u00e9e est pour la machine, et le parser est le traducteur entre les deux.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Quelques exemples&#8230;<\/h2>\n\n\n\n<!-- MOGWAI \u2014 Sucre syntaxique \u2192 Forme RPN canonique -->\n<!-- Copier-coller ce bloc dans votre article de blog -->\n\n<style>\n  .mogwai-table {\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n    max-width: 900px;\n    margin: 2rem auto;\n  }\n  .mogwai-table h3 {\n    font-size: 0.78rem;\n    font-weight: 600;\n    letter-spacing: 0.08em;\n    text-transform: uppercase;\n    color: #6b7280;\n    margin: 0 0 1rem 0;\n  }\n  .mogwai-row {\n    margin-bottom: 0.75rem;\n    border-radius: 10px;\n    overflow: hidden;\n    border: 1px solid #e5e7eb;\n  }\n  .mogwai-tag {\n    background: #f3f4f6;\n    border-bottom: 1px solid #e5e7eb;\n    padding: 0.35rem 1rem;\n    font-size: 0.72rem;\n    font-weight: 600;\n    letter-spacing: 0.06em;\n    text-transform: uppercase;\n    color: #6b7280;\n  }\n  .mogwai-cols {\n    display: grid;\n    grid-template-columns: 1fr 36px 1fr;\n    align-items: stretch;\n  }\n  .mogwai-cell {\n    padding: 0.85rem 1rem;\n    background: #ffffff;\n  }\n  .mogwai-cell.sugar  { border-left: 3px solid #10b981; }\n  .mogwai-cell.rpn    { border-left: 3px solid #8b5cf6; background: #fafafa; }\n  .mogwai-arrow {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    background: #f9fafb;\n    color: #9ca3af;\n    font-size: 1rem;\n    border-left: 1px solid #e5e7eb;\n    border-right: 1px solid #e5e7eb;\n  }\n  .mogwai-cell pre {\n    margin: 0;\n    font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, monospace;\n    font-size: 0.8rem;\n    line-height: 1.65;\n    white-space: pre-wrap;\n    color: #1f2937;\n  }\n  .kw  { color: #10b981; font-weight: 600; }\n  .kw2 { color: #8b5cf6; font-weight: 600; }\n  .str { color: #f59e0b; }\n  .sym { color: #ef4444; }\n  .dim { color: #9ca3af; font-style: italic; }\n  .mogwai-legend {\n    display: flex;\n    gap: 1.5rem;\n    margin-top: 0.75rem;\n    font-size: 0.75rem;\n    color: #6b7280;\n  }\n  .mogwai-legend span {\n    display: flex;\n    align-items: center;\n    gap: 0.4rem;\n  }\n  .mogwai-legend span::before {\n    content: '';\n    display: inline-block;\n    width: 12px;\n    height: 12px;\n    border-radius: 2px;\n  }\n  .mogwai-legend .leg-sugar::before { background: #10b981; }\n  .mogwai-legend .leg-rpn::before   { background: #8b5cf6; }\n<\/style>\n\n<div class=\"mogwai-table\">\n  <h3>MOGWAI \u2014 Sucre syntaxique \u2192 Forme RPN canonique<\/h3>\n\n  <!-- D\u00e9finition de fonction -->\n  <div class=\"mogwai-row\">\n    <div class=\"mogwai-tag\">D\u00e9finition de fonction<\/div>\n    <div class=\"mogwai-cols\">\n      <div class=\"mogwai-cell sugar\"><pre><span class=\"kw\">to<\/span> <span class=\"str\">'greet'<\/span> <span class=\"kw\">with<\/span> [name: .string] <span class=\"kw\">do<\/span>\n{\n    <span class=\"dim\">... corps ...<\/span>\n}<\/pre><\/div>\n      <div class=\"mogwai-arrow\">\u2192<\/div>\n      <div class=\"mogwai-cell rpn\"><pre><span class=\"sym\">\u00ab<\/span>[name: .string] <span class=\"sym\">->safeVars<\/span>\n  <span class=\"dim\">... corps ...<\/span>\n<span class=\"sym\">\u00bb<\/span> <span class=\"str\">'greet'<\/span> <span class=\"kw2\">DEFUNC<\/span><\/pre><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Affectation -->\n  <div class=\"mogwai-row\">\n    <div class=\"mogwai-tag\">Affectation de variable<\/div>\n    <div class=\"mogwai-cols\">\n      <div class=\"mogwai-cell sugar\"><pre><span class=\"kw\">now<\/span> <span class=\"sym\">-><\/span> <span class=\"str\">'begin'<\/span>\ncode size <span class=\"sym\">-><\/span> <span class=\"str\">'code_len'<\/span><\/pre><\/div>\n      <div class=\"mogwai-arrow\">\u2192<\/div>\n      <div class=\"mogwai-cell rpn\"><pre><span class=\"kw2\">now<\/span> <span class=\"str\">'begin'<\/span> <span class=\"kw2\">STO<\/span>\ncode size <span class=\"str\">'code_len'<\/span> <span class=\"kw2\">STO<\/span><\/pre><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- for -->\n  <div class=\"mogwai-row\">\n    <div class=\"mogwai-tag\">Boucle for<\/div>\n    <div class=\"mogwai-cols\">\n      <div class=\"mogwai-cell sugar\"><pre><span class=\"sym\">0<\/span> <span class=\"sym\">@code_len<\/span> <span class=\"sym\">1<\/span> - <span class=\"kw\">for<\/span> <span class=\"str\">'i'<\/span> <span class=\"kw\">do<\/span>\n{\n    <span class=\"dim\">... corps ...<\/span>\n}<\/pre><\/div>\n      <div class=\"mogwai-arrow\">\u2192<\/div>\n      <div class=\"mogwai-cell rpn\"><pre><span class=\"sym\">0<\/span> <span class=\"sym\">@code_len<\/span> <span class=\"sym\">1<\/span> -  <span class=\"str\">'i'<\/span>\n  {<span class=\"dim\">... corps ...<\/span>}\n<span class=\"kw2\">FOR<\/span><\/pre><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- while -->\n  <div class=\"mogwai-row\">\n    <div class=\"mogwai-tag\">Boucle while<\/div>\n    <div class=\"mogwai-cols\">\n      <div class=\"mogwai-cell sugar\"><pre><span class=\"kw\">while<\/span> (<span class=\"sym\">@code_ptr @code_len<\/span> &lt;) <span class=\"kw\">do<\/span>\n{\n    <span class=\"dim\">... corps ...<\/span>\n}<\/pre><\/div>\n      <div class=\"mogwai-arrow\">\u2192<\/div>\n      <div class=\"mogwai-cell rpn\"><pre>{<span class=\"sym\">@code_ptr @code_len<\/span> &lt;}\n  {<span class=\"dim\">... corps ...<\/span>}\n<span class=\"kw2\">WHILE<\/span><\/pre><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- if -->\n  <div class=\"mogwai-row\">\n    <div class=\"mogwai-tag\">Conditionnel if \/ then<\/div>\n    <div class=\"mogwai-cols\">\n      <div class=\"mogwai-cell sugar\"><pre><span class=\"kw\">if<\/span> (<span class=\"sym\">@cell_ptr<\/span> <span class=\"sym\">0<\/span> &gt;) <span class=\"kw\">then<\/span>\n{\n    <span class=\"str\">'cell_ptr'<\/span> --\n}<\/pre><\/div>\n      <div class=\"mogwai-arrow\">\u2192<\/div>\n      <div class=\"mogwai-cell rpn\"><pre>{<span class=\"sym\">!<\/span> <span class=\"sym\">@cell_ptr<\/span> <span class=\"sym\">0<\/span> &gt;}\n  {<span class=\"str\">'cell_ptr'<\/span> --}\n<span class=\"kw2\">IF<\/span><\/pre><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- switch -->\n  <div class=\"mogwai-row\">\n    <div class=\"mogwai-tag\">Switch \/ pattern matching<\/div>\n    <div class=\"mogwai-cols\">\n      <div class=\"mogwai-cell sugar\"><pre><span class=\"kw\">switch<\/span>\n{\n    (<span class=\"sym\">@instr _91:<\/span> ==) <span class=\"kw\">then<\/span> { <span class=\"dim\">... corps A ...<\/span> }\n    (<span class=\"sym\">@instr _93:<\/span> ==) <span class=\"kw\">then<\/span> { <span class=\"dim\">... corps B ...<\/span> }\n}<\/pre><\/div>\n      <div class=\"mogwai-arrow\">\u2192<\/div>\n      <div class=\"mogwai-cell rpn\"><pre>{{<span class=\"sym\">@instr _91:<\/span> ==} {<span class=\"dim\">... corps A ...<\/span>}\n {<span class=\"sym\">@instr _93:<\/span> ==} {<span class=\"dim\">... corps B ...<\/span>}}\n<span class=\"kw2\">SWITCH<\/span><\/pre><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Commentaires -->\n  <div class=\"mogwai-row\">\n    <div class=\"mogwai-tag\">Commentaires et mise en forme<\/div>\n    <div class=\"mogwai-cols\">\n      <div class=\"mogwai-cell sugar\"><pre><span class=\"dim\"># Commentaire explicatif\n# Indentation, lignes vides...<\/span><\/pre><\/div>\n      <div class=\"mogwai-arrow\">\u2192<\/div>\n      <div class=\"mogwai-cell rpn\"><pre><span class=\"dim\">(supprim\u00e9s \u2014 le flux RPN\nest un flux lin\u00e9aire de tokens)<\/span><\/pre><\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"mogwai-legend\">\n    <span class=\"leg-sugar\">Forme source (avec sucre syntaxique)<\/span>\n    <span class=\"leg-rpn\">Forme canonique RPN (apr\u00e8s parsing)<\/span>\n  <\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ce-quand39il-faut-retenir\">Ce qu&rsquo;il faut retenir<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Chaque transformation effectu\u00e9e par le parser <a href=\"https:\/\/www.mogwai.eu.com\" data-type=\"link\" data-id=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> suit la m\u00eame r\u00e8gle de fond : prendre une construction lisible par un humain, en extraire les parties, les disposer sur la pile dans le bon ordre, et remplacer le mot-cl\u00e9 sucr\u00e9 par le mot primitif correspondant. <code>to ... do<\/code> devient <code>DEFUNC<\/code>. <code>while ... do<\/code> devient <code>WHILE<\/code>. <code>if ... then<\/code> devient <code>IF<\/code>. <code>-&gt;<\/code> devient <code>STO<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aucune de ces transformations ne change la s\u00e9mantique. Elles ne changent que la surface. Le runtime ne voit jamais le sucre \u2014 il ne voit qu&rsquo;une s\u00e9quence de valeurs et de mots, qui traversent la pile exactement comme si vous aviez \u00e9crit la forme canonique \u00e0 la main.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est ce qui rend la conception fiable : le sucre est une commodit\u00e9, pas un tour de magie. Si vous avez jamais besoin de comprendre ce que <a href=\"https:\/\/www.mogwai.eu.com\" data-type=\"link\" data-id=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> fait r\u00e9ellement, vous pouvez toujours tracer l&rsquo;ex\u00e9cution en lisant la forme canonique. Les deux couches sont transparentes l&rsquo;une pour l&rsquo;autre.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Et si vous voulez mesurer ce que ce sucre vous \u00e9pargne, essayez d&rsquo;\u00e9crire un <code>switch<\/code> non trivial \u00e0 la main en RPN pur. Vous appr\u00e9cierez le mot-cl\u00e9 <code>do<\/code> tr\u00e8s rapidement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">St\u00e9phane.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il y a un moment que tout concepteur de langage \u00e0 pile redoute. Vous ouvrez un script \u00e9crit trois semaines plus t\u00f4t, et il ressemble \u00e0 \u00e7a : code size &lsquo;code_len&rsquo; STO 0 @code_len 1 &#8211; &lsquo;i&rsquo; {\u00ab\u00a0_\u00a0\u00bb code @i 1 sub char-> ->str + ->key} FOR Parfaitement valide. Parfaitement ex\u00e9cutable. Compl\u00e8tement illisible. C&rsquo;est la &#8230; <a title=\"MOGWAI sous le capot : sucre syntaxique et forme canonique RPN\" class=\"read-more\" href=\"https:\/\/coding4phone.com\/?p=1901\" aria-label=\"En savoir plus sur MOGWAI sous le capot : sucre syntaxique et forme canonique RPN\">Lire la suite<\/a><\/p>\n","protected":false},"author":1,"featured_media":1930,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"D\u00e9couvrez MOGWAI, le langage RPN qui allie syntaxe lisible et ex\u00e9cution directe, facilitant l'\u00e9criture de codes maintenables.","jetpack_seo_html_title":"MOGWAI : Am\u00e9liorer la lisibilit\u00e9 des langages RPN","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,"token":"eyJpbWciOiJodHRwczpcL1wvY29kaW5nNHBob25lLmNvbVwvd3AtY29udGVudFwvdXBsb2Fkc1wvMjAyNlwvMDNcL2ltYWdlLTIucG5nIiwidHh0IjoiTU9HV0FJIHNvdXMgbGUgY2Fwb3QgOiBzdWNyZSBzeW50YXhpcXVlIGV0IGZvcm1lIGNhbm9uaXF1ZSBSUE4iLCJ0ZW1wbGF0ZSI6ImhpZ2h3YXkiLCJmb250IjoiIiwiYmxvZ19pZCI6MjI3NDE5MDA0fQ.z4FdjqCt48sl3EcoGg_3jdVKA3P7xDmxpCA4qnT9S8oMQ"},"version":2,"media_source":"featured-image","attached_media":[]},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[8,6,48,50],"tags":[21,51,52],"class_list":["post-1901","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-mogwai","category-rpn","category-scripting","tag-mogwai","tag-rpn","tag-scripting"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/03\/image-2.png?fit=1024%2C768&ssl=1","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfoe4s-uF","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/1901","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=1901"}],"version-history":[{"count":19,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/1901\/revisions"}],"predecessor-version":[{"id":1947,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/1901\/revisions\/1947"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/media\/1930"}],"wp:attachment":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1901"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1901"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1901"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}