Skip to content

Releases: issadicko/krom-lang

KromScript 1.0.4 — les noms pointés

Choose a tag to compare

@issadicko issadicko released this 12 Aug 23:03
04cb2ec

Prépare les imports scopés du bundler (@use "…" as ns) : un module compilé en fermeture expose ses déclarations dans un objet, et il faut pouvoir les atteindre depuis l'hôte.

Une fonction appelée par son nom peut vivre dans un espace de noms

invoke, invokeSync et invokeSynchronized cherchaient le nom reçu à plat dans l'environnement. Un hôte qui passe une fonction par chaîne de caractères — builder: "homeTab", onTap: "valider" — ne pouvait donc atteindre qu'une déclaration de premier niveau.

Le nom accepte désormais des points : "homeView.homeTab" récupère homeView, descend dans la map, et appelle ce qu'il y trouve. Chaque segment intermédiaire doit être une map ; sinon la résolution échoue proprement sur le not found habituel, ce qui laisse intact le moyen qu'a l'hôte de distinguer un hook absent d'une vraie erreur.

Un nom sans point suit exactement le chemin d'avant.

L'état réactif d'un module reste visible

reactiveState() ne voyait que les Obs de premier niveau, et ceux d'un module scopé auraient disparu derrière leur map. Les objets sont maintenant ouverts d'un niveau et leurs entrées réactives rapportées sous la forme module.nom. setReactiveValue() accepte le même chemin, pour qu'un inspecteur d'état puisse toujours écrire ce qu'il affiche.

Un alias qui ne vit que dans une chaîne n'est plus supprimé

L'élimination de code mort ne comptait comme usage qu'un identifiant. Une variable dont la seule référence est une chaîne pointée — builder: "homeView.homeTab", que l'hôte résout à l'appel — passait donc pour morte et disparaissait, emportant le module entier.

Une chaîne de la forme nom.nom compte désormais comme un usage de son premier segment. Le motif est strict : une phrase ou un nom de fichier ne garde rien en vie.


Aucun changement de comportement pour un nom sans point. 372 tests verts.

dart pub add krom_script:^1.0.4

KromScript 1.0.3 — les erreurs d'exécution disent où

Choose a tag to compare

@issadicko issadicko released this 08 Aug 22:44

Changes

  • Les erreurs d'exécution portent une position. undefined variable, cannot access property, not a function, division par zéro, opérateurs inconnus et arguments des helpers de liste sortent avec le numéro de ligne.
  • Quand l'interprète détecte l'erreur lui-même, il connaît l'expression fautive et donne aussi la colonne.
  • Pour les erreurs levées ailleurs, une fonction native par exemple, il donne la ligne de l'instruction en cours.

Technical

  • Statement et Expression déclarent Token get token. Les sous-classes le stockaient déjà.
  • Un KromResourceError (budget, délai) garde son type.
  • Une erreur qui a déjà une position n'est pas réécrite.

À noter

  • Les erreurs qui étaient des Exception nues deviennent des KromRuntimeError. Le message ne change pas, la position s'ajoute en suffixe.

pub.dev · #25

KromScript 1.0.2 — correctifs de justesse et de sûreté

Choose a tag to compare

@issadicko issadicko released this 01 Aug 00:53

Six correctifs de justesse et de sûreté (#10 à #15). Le numéro est un correctif, mais plusieurs changements sont visibles depuis un script ou depuis l'hôte — lire la section Migration du CHANGELOG avant de monter de version.

Correctifs

  • Résolution de propriété (#10, #11) — lire une propriété nulle ou absente rend null au lieu de lever. ?. résout comme . et ne court-circuite plus que sur un receveur nul : l?.length rendait null là où l.length rendait 3. Une propriété nulle sur un objet lié ne rend plus un wrapper appelable, qui pouvait entrer silencieusement dans les données de l'hôte.
  • Garde d'exécution (#13) — ExecutionLimits s'applique désormais par défaut à eval, run et builder().execute(), comme sa documentation l'annonçait depuis 1.0.0. while (true) {} ne bloque plus indéfiniment. Nouveau withLimits(...) ; ExecutionLimits.unlimited pour désarmer explicitement.
  • Analyse (#12) — une chaîne non terminée et un bloc non fermé produisent une erreur de syntaxe positionnée, comme ( et [ le faisaient déjà. Ces sources tronquées étaient acceptées puis exécutées.
  • Opérateurs d'ordre (#15) — <, >, <=, >= ne coercent plus les opérandes non numériques vers 0.0. null < 5 répondait true : dans un moteur de règles, age < 18 sur un champ vide déclenchait une validation qui devait rester dormante.
  • Représentation numérique (#14) — une seule règle à toutes les frontières : un entier reste int, un décimal reste double. Un même champ se sérialisait 3 ou 3.0 selon qu'un script l'avait touché. jsonStringify suit la même règle, ce qui révoque la décision de 1.0.0 de préserver 2.0 en format réseau.

Migration

Le point le plus susceptible de casser à l'exécution : result.value as double lève désormais sur un entier. Utiliser as num.

Les autres changements visibles — comparaisons d'ordre qui passent de true à false, sources tronquées rejetées, scripts non bornés qui atteignent le budget, sortie jsonStringify sans .0 — sont détaillés un par un dans la section Migration du changelog.

Qualité

379 tests (contre 267 en 1.0.1), dart analyze et dart format propres. Les 8 cas de conformité encore rouges sont des fonctionnalités du canon non implémentées, suivies dans #24 — inchangés par cette version.

KromScript 1.0.1 — qualité du paquet

Choose a tag to compare

@issadicko issadicko released this 15 Jul 18:09

Patch de qualité, sans changement d'API ni de comportement.

  • Code entièrement conforme à dart format.
  • Suppression du code mort signalé par l'analyseur (imports, champs et variables inutilisés) dans lib/, bin/ et test/.
  • path déclaré en dev_dependency.

Objectif : score Pass static analysis 50/50 sur pub.dev. Aucune migration nécessaire depuis 1.0.0.

KromScript 1.0.0 — Stable, sûr, prêt pour la production

Choose a tag to compare

@issadicko issadicko released this 13 Jul 12:33

Première version stable de KromScript. Après la série 0.x, le langage embarqué qui fait vivre les mini-apps Krom entre en 1.0 : API figée, sûreté par défaut et un langage nettement plus expressif — sur Dart, Kotlin, Go et TypeScript.

✨ Un langage plus complet et plus ergonomique

  • Chaînes else if — fini les if imbriqués.
  • Affectations composées : +=, -=, *=, /=.
  • Opérateur ternaire : cond ? a : b.
  • for-in sur les maps — itère directement sur les clés.
  • Natif range() pour les boucles numériques.
  • Commentaires bloc /* ... */.
  • Affichage des nombres entiers sans .0 : 4, plus 4.0 — un toString enfin naturel dans les vues (interpolation, +, print, join, clés de map). jsonStringify reste inchangé (format réseau préservé).

🛡️ Sûr par défaut

  • Garde d'exécution activée d'office : budget d'opérations + deadline. Un script tiers ne peut plus figer l'hôte. ExecutionLimits.unlimited reste disponible pour du code de confiance.
  • print() est désormais aussi routé vers la sortie standard, en plus de developer.log, pour un débogage sans friction.

🔎 Optimiseur durci et introspectable

  • Correction de plusieurs bugs de fausse suppression / transformation de l'optimiseur (propagation de constantes dans boucles et closures, inlining capturant un paramètre, round-trip du else après optimisation…).
  • Les hooks de cycle de vie (onInit/onShow/onHide/onDispose) sont préservés au tree-shaking.
  • Introspection réactive pour l'hôte : reactiveState() / setReactiveValue() pour lire et piloter l'état, lastOpsUsed / maxOperations pour instrumenter le budget.

🌍 Multi-plateforme

Même langage, quatre implémentations : Dart/Flutter, Kotlin (Maven Central), Go (pkg.go.dev), TypeScript (npm).

📖 Documentation

Guide complet : https://docs-kodiscript.dickode.net/


Rien à migrer depuis 0.2.0 : ces ajouts sont rétrocompatibles.