La version 8.7 de MOGWAI vient d’être publiée sur NuGet. Cette version n’introduit pas de changement architectural majeur — elle consolide et enrichit ce qui existe déjà, avec quatre nouvelles primitives couvrant des besoins bien distincts, et deux corrections importantes.
« guid7 » des identifiants vraiment ordonnés
MOGWAI proposait déjà guid pour générer des UUID v4. La v8.7 ajoute guid7, basé sur la spécification UUID v7.
La différence est importante : un UUID v4 est purement aléatoire. Un UUID v7 encode les 48 premiers bits avec l’horodatage Unix en millisecondes, ce qui le rend monotoniquement croissant. Concrètement, deux appels successifs à guid7 produiront toujours des valeurs triées dans le bon ordre.
guid7 -> '$id'
$id ? # → "4843BAB6-6A90-4138-AC9F-DB7ABE0018CB"
C’est un détail qui change beaucoup en pratique : les bases de données relationnelles indexent beaucoup plus efficacement des clés primaires ordonnées. Si vous utilisez MOGWAI dans un contexte où les identifiants alimentent une base de données, guid7 est le bon choix.
Introspection OOP : « isAlive » et « frame »
Le système de classes introduit en v8.6 s’enrichit de trois primitives d’introspection qui permettent d’interroger l’état du moteur à l’exécution.
« isAlive » : vérifier qu’une référence est encore valide
Quand une instance est libérée via free, toute variable qui en conservait la référence devient invalide. isAlive permet de tester cet état sans risquer d’erreur — elle retourne simplement true ou false, quelles que soient les circonstances.
if ($U1 isAlive) then
{
$U1->display:
}
C’est le complément naturel de isEmpty et isNull pour écrire du code défensif propre.
« alive » : lister toutes les instances actives
alive retourne la liste de toutes les références .objref actuellement vivantes dans le moteur. Combinée à foreach...filter, elle permet des requêtes très expressives :
# Récupérer toutes les instances d'une classe donnée
alive foreach 'item' filter { item->className: 'User' == } -> '$users'
C’est utile pour le débogage, mais aussi pour des patterns de gestion de ressources où l’on souhaite inspecter ou libérer l’ensemble des instances d’un type.
« frame » : inspecter la structure d’une classe
frame prend un nom de classe et retourne un record décrivant sa structure complète : propriétés publiques et privées avec leurs types déclarés, méthodes publiques et privées.
'Counter' frame ?
# → [className: 'Counter' props: [value: .number] _props: [_step: .number] funcs: (onInit: increment: reset:) _funcs: ()]
C’est une primitive de métaprogrammation légère qui ouvre la porte à des outils d’inspection, de génération de code ou de sérialisation générique basés sur la structure des classes.
« process.exec » : lancer un processus et capturer sa sortie
process.exec complète process.start avec un comportement bloquant : elle lance un processus externe, attend sa fin, et pousse sur la pile un record contenant le code de retour, le contenu de stdout et le contenu de stderr.
[filename: "dotnet" arguments: "--version"] process.exec -> '$r'
$r status: get ? # 0
$r output: get ? # "10.0.203"
Il est également possible d’envoyer des données sur l’entrée standard du processus via la clé input: :
[filename: "myservice.exe" input: "42"] process.exec -> '$r'
Les deux flux sont lus en parallèle pour éviter les deadlocks de buffer — un problème classique avec les wrappers de processus naïfs. process.exec est particulièrement utile dans les scripts d’automatisation ou d’intégration, où MOGWAI orchestre des outils externes.
Corrections
Deux bugs ont été corrigés dans cette version.
free avec onFree: défini. Lorsqu’une classe définissait un hook onFree:, appeler free exécutait correctement le hook, mais l’instance n’était pas retirée du registre interne. Elle restait donc accessible, et isAlive retournait incorrectement true après la libération. C’est désormais corrigé dans tous les cas.
Réinitialisation du runtime. Lors d’un reset du moteur, la pile n’était pas vidée correctement. Ce bug pouvait laisser des valeurs résiduelles dans un état qui devait être propre.
En résumé
MOGWAI 8.7 est une version de consolidation ciblée. guid7 répond à un besoin concret des applications orientées base de données. Les trois primitives OOP transforment le système de classes en un système véritablement introspectable. process.exec ouvre MOGWAI aux scénarios d’automatisation et d’intégration système. Et les deux corrections résolvent des comportements incorrects qui auraient pu être difficiles à diagnostiquer.
La version 8.7 est disponible dès maintenant sur NuGet et sur GitHub.