{"id":2306,"date":"2026-04-23T10:45:35","date_gmt":"2026-04-23T09:45:35","guid":{"rendered":"https:\/\/coding4phone.com\/?p=2306"},"modified":"2026-04-23T10:45:36","modified_gmt":"2026-04-23T09:45:36","slug":"mogwai-v8-6-objets-et-assertions","status":"publish","type":"post","link":"https:\/\/coding4phone.com\/?p=2306","title":{"rendered":"MOGWAI v8.6 : Objets et assertions"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>MOGWAI vient de passer en version 8.6, et cette release apporte deux fonctionnalit\u00e9s attendues de longue date : un syst\u00e8me complet de programmation orient\u00e9e objet, et une primitive d&rsquo;assertion int\u00e9gr\u00e9e. Tour d&rsquo;horizon.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"la-poo-dans-un-langage-a-pile\">La POO dans un langage \u00e0 pile<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si vous suivez MOGWAI depuis un moment, vous savez que le langage est fondamentalement <a href=\"https:\/\/en.wikipedia.org\/wiki\/Concatenative_programming_language\" target=\"_blank\" rel=\"noreferrer noopener\">concat\u00e9natif<\/a> et bas\u00e9 sur une pile, inspir\u00e9 des calculatrices HP RPL. Ajouter la POO \u00e0 un tel langage soul\u00e8ve une question \u00e9vidente : est-ce que \u00e7a a vraiment du sens ?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La r\u00e9ponse est oui, et voil\u00e0 pourquoi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MOGWAI disposait d\u00e9j\u00e0 des records (structures cl\u00e9-valeur nomm\u00e9es), des fonctions, et d&rsquo;un syst\u00e8me de types riche. Ce qui manquait, c&rsquo;\u00e9tait la possibilit\u00e9 de <strong>lier des donn\u00e9es et des comportements<\/strong>, de donner un nom \u00e0 cet ensemble, et de g\u00e9rer plusieurs instances ind\u00e9pendantes. C&rsquo;est exactement ce que la v8.6 apporte.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"definir-une-classe\">D\u00e9finir une classe<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Les classes se d\u00e9finissent avec le mot-cl\u00e9 <code>class<\/code>, suivi du nom de la classe, du mot-cl\u00e9 <code>do<\/code>, et d&rsquo;un bloc contenant deux sections : <code>private:<\/code> et <code>public:<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">class 'Counter' do<br>{<br>    private:<br>    {<br>        _step: .number<br>    }<br><br>    public:<br>    {<br>        value: .number<br><br>        onInit:<br>        {<br>            [step: (.number 1)] ->params<br><br>            self->reset:<br>            step self&lt;-_step:<br>        }<br><br>        increment:<br>        {<br>            self->value: self->_step: + self&lt;-value:<br>        }<br><br>        reset:<br>        {<br>            0 self&lt;-value:<br>        }<br>    }<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Les propri\u00e9t\u00e9s sont d\u00e9clar\u00e9es avec un sigil de type (<code>.number<\/code>, <code>.string<\/code>, <code>.bool<\/code>, <code>.any<\/code>\u2026). Les m\u00e9thodes sont d\u00e9clar\u00e9es avec un bloc de code <code>{ }<\/code>. La distinction est faite \u00e0 l&rsquo;analyse syntaxique sans ambigu\u00eft\u00e9.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"hooks-de-cycle-de-vie\">Hooks de cycle de vie<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Deux m\u00e9thodes sp\u00e9ciales sont reconnues par le moteur :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>onInit:<\/code> appel\u00e9e automatiquement \u00e0 la cr\u00e9ation d&rsquo;une instance avec <code>new<\/code>. Elle re\u00e7oit les param\u00e8tres nomm\u00e9s pass\u00e9s \u00e0 la cr\u00e9ation.<\/li>\n\n\n\n<li><code>onFree:<\/code> appel\u00e9e automatiquement juste avant la destruction d&rsquo;une instance avec <code>free<\/code>.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"creer-et-utiliser-des-instances\">Cr\u00e9er et utiliser des instances<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\"># Cr\u00e9er une instance \u2014 onInit: est appel\u00e9e automatiquement<br>[id: 10 name: \"SIBUE\"] 'User' new -> '$U1'<br><br># Lire une propri\u00e9t\u00e9 publique<br>$U1->name: ?<br><br># \u00c9crire une propri\u00e9t\u00e9 publique<br>\"DUPONT\" &amp;$U1&lt;-name:<br><br># Appeler une m\u00e9thode publique<br>$U1->display:<br><br># V\u00e9rifier qu'une instance est encore en vie<br>$U1 isAlive<br><br># D\u00e9truire l'instance \u2014 onFree: est appel\u00e9e automatiquement<br>$U1 free<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La notation <code>-><\/code> et <code>&lt;-<\/code> sera naturelle pour quiconque a utilis\u00e9 la syntaxe des records MOGWAI. Lire depuis une instance, y \u00e9crire, appeler une m\u00e9thode, tout est coh\u00e9rent avec le reste du langage.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"self--land39instance-courante-dans-une-methode\"><code>self<\/code> \u2014 l&rsquo;instance courante dans une m\u00e9thode<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c0 l&rsquo;int\u00e9rieur de n&rsquo;importe quelle m\u00e9thode, <code>self<\/code> est automatiquement disponible et r\u00e9f\u00e9rence l&rsquo;instance courante :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">display:<br>{<br>    \"USER={! self}\" eval ?<br>    self->show:         # appelle une m\u00e9thode priv\u00e9e<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Utiliser <code>self<\/code> en dehors d&rsquo;une m\u00e9thode l\u00e8ve une erreur.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"encapsulation-sans-heritage\">Encapsulation sans h\u00e9ritage<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ce syst\u00e8me POO est d\u00e9lib\u00e9r\u00e9ment simple : <strong>pas d&rsquo;h\u00e9ritage, pas de garbage collector<\/strong>. Vous avez le contr\u00f4le total de la cr\u00e9ation et de la destruction des instances.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Les membres priv\u00e9s sont strictement inaccessibles depuis l&rsquo;ext\u00e9rieur de la classe. La propri\u00e9t\u00e9 r\u00e9serv\u00e9e en lecture seule <code>className:<\/code> est automatiquement disponible sur chaque instance et retourne le nom de la classe \u00e0 laquelle elle appartient :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$U1->className: ?   # \u2192 'User'<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Plusieurs variables peuvent r\u00e9f\u00e9rencer la m\u00eame instance. Si l&rsquo;instance est lib\u00e9r\u00e9e, toutes les variables qui pointent dessus deviennent invalides. Le pr\u00e9dicat <code>isAlive<\/code> permet de v\u00e9rifier en toute s\u00e9curit\u00e9 avant d&rsquo;y acc\u00e9der :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">if ($U1 isAlive) then<br>{<br>    $U1->display:<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>isAlive<\/code> est une recherche en O(1), il ne l\u00e8ve jamais d&rsquo;erreur sur une r\u00e9f\u00e9rence morte, il renvoie simplement <code>false<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"validation-des-parametres-de-methode\">Validation des param\u00e8tres de m\u00e9thode<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">MOGWAI propose trois niveaux de validation des entr\u00e9es dans les m\u00e9thodes, tous parfaitement utilisables au sein des classes :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>->vars<\/code> : d\u00e9structuration simple, sans v\u00e9rification de type<\/li>\n\n\n\n<li><code>->safeVars<\/code> : d\u00e9structuration avec validation de type<\/li>\n\n\n\n<li><code>->params<\/code> : record de param\u00e8tres nomm\u00e9s avec types et valeurs par d\u00e9faut optionnelles (le choix naturel pour <code>onInit:<\/code>)<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\">onInit:<br>{<br>    [id: .number name: .string index: (.number 0)] ->params<br><br>    id self&lt;-id:<br>    name self&lt;-name:<br>    index self&lt;-index:<br>}<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"mogwaiassert--les-preconditions-a-la-sauce-mogwai\">mogwai.assert : Les pr\u00e9conditions \u00e0 la sauce MOGWAI<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Le deuxi\u00e8me ajout majeur de la v8.6 est <code>mogwai.assert<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il v\u00e9rifie qu&rsquo;une condition est vraie. Si elle est fausse, il l\u00e8ve l&rsquo;erreur <code>MW.9<\/code> (assert error) et stoppe l&rsquo;ex\u00e9cution. Si <code>MOGWAI.onError<\/code> est d\u00e9fini, il sera d\u00e9clench\u00e9 automatiquement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La signature est simple :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">condition \"message\" mogwai.assert<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La condition peut \u00eatre :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Une <strong>liste<\/strong> \u00e9valu\u00e9e automatiquement. <code>mogwai.assert<\/code> v\u00e9rifie qu&rsquo;exactement un bool\u00e9en a \u00e9t\u00e9 pouss\u00e9 sur la pile apr\u00e8s l&rsquo;ex\u00e9cution.<\/li>\n\n\n\n<li>Un <strong>bool\u00e9en<\/strong> d\u00e9j\u00e0 sur la pile utilis\u00e9 directement.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\"># Forme liste, condition \u00e9valu\u00e9e par mogwai.assert<br>(a 10 ==) \"a doit \u00eatre \u00e9gal \u00e0 10\" mogwai.assert<br><br># Forme bool\u00e9enne, r\u00e9sultat d\u00e9j\u00e0 sur la pile<br>a 0 >  \"a doit \u00eatre positif\"  mogwai.assert<br>a ->type .list ==  \"a doit \u00eatre une liste\" mogwai.assert<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le message est affich\u00e9 avec l&rsquo;erreur, c&rsquo;est une information de diagnostic, pas une valeur. Il n&rsquo;est pas accessible programmatiquement via <code>error.last<\/code>, qui renvoie <code>MW.9<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"le-cas-dand39usage-evident--les-preconditions-dans-les-fonctions\">Le cas d&rsquo;usage \u00e9vident : les pr\u00e9conditions dans les fonctions<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">to 'divide' with [x: .number y: .number] do<br>{<br>    (y 0 !=) \"le diviseur ne doit pas \u00eatre z\u00e9ro\" mogwai.assert<br>    x y \/<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est le pattern pour lequel <code>mogwai.assert<\/code> a \u00e9t\u00e9 con\u00e7u : prot\u00e9ger le point d&rsquo;entr\u00e9e d&rsquo;une fonction, \u00e9chouer imm\u00e9diatement et clairement si le contrat est viol\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il peut aussi servir pour des tests en script, pour valider des hypoth\u00e8ses sur l&rsquo;\u00e9tat \u00e0 un moment donn\u00e9 de l&rsquo;ex\u00e9cution, sans avoir besoin d&rsquo;un framework de test externe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"et-maintenant-\">Et maintenant ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La v8.6 est disponible d\u00e8s maintenant sur <a href=\"https:\/\/www.nuget.org\/packages\/MOGWAI\">NuGet<\/a> et <a href=\"https:\/\/github.com\/Sydney680928\/MOGWAI\">GitHub<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La documentation compl\u00e8te a \u00e9t\u00e9 mise \u00e0 jour. Exemples, changelog et playground sont disponibles sur <a href=\"https:\/\/mogwai.eu.com\">mogwai.eu.com<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si vous d\u00e9couvrez MOGWAI \u2014 un moteur de scripting RPN bas\u00e9 sur une pile pour .NET, open-sourc\u00e9 sous licence Apache 2.0 \u2014 le <a href=\"https:\/\/github.com\/Sydney680928\/MOGWAI\">README<\/a> est le meilleur point de d\u00e9part.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vos retours sont les bienvenus dans les <a href=\"https:\/\/github.com\/Sydney680928\/MOGWAI\/discussions\">Discussions<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>MOGWAI vient de passer en version 8.6, et cette release apporte deux fonctionnalit\u00e9s attendues de longue date : un syst\u00e8me complet de programmation orient\u00e9e objet, et une primitive d&rsquo;assertion int\u00e9gr\u00e9e. Tour d&rsquo;horizon. La POO dans un langage \u00e0 pile Si vous suivez MOGWAI depuis un moment, vous savez que le langage est fondamentalement concat\u00e9natif et &#8230; <a title=\"MOGWAI v8.6 : Objets et assertions\" class=\"read-more\" href=\"https:\/\/coding4phone.com\/?p=2306\" aria-label=\"En savoir plus sur MOGWAI v8.6 : Objets et assertions\">Lire la suite<\/a><\/p>\n","protected":false},"author":1,"featured_media":2322,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"D\u00e9couvrez les nouvelles fonctionnalit\u00e9s de MOGWAI 8.6 : la programmation orient\u00e9e objet et l'assertion int\u00e9gr\u00e9e pour vos projets de script.","jetpack_seo_html_title":"Nouveaut\u00e9s de MOGWAI 8.6 : POO et Assertions In\u00e9dites","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":"MOGWAI vient de passer en version 8.6, et cette release apporte deux fonctionnalit\u00e9s : un syst\u00e8me complet de programmation orient\u00e9e objet, et une primitive d'assertion int\u00e9gr\u00e9e.","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":[],"class_list":["post-2306","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-mogwai","category-rpn","category-scripting"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/04\/coding-4-phone-69e9e84953a1d.png?fit=1024%2C1024&ssl=1","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfoe4s-Bc","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2306","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=2306"}],"version-history":[{"count":16,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2306\/revisions"}],"predecessor-version":[{"id":2323,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2306\/revisions\/2323"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/media\/2322"}],"wp:attachment":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2306"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2306"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2306"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}