Files
saselang-bible/003-CHANGELOG.md
2026-09-13 10:20:16 +02:00

106 lines
8.8 KiB
Markdown

# Changelog documentaire — 0.2.17
## 0.2.17
- hiérarchie `Error` étendue à trois branches sœurs : `ResultError`, `Exception`, `Fault` ;
- `Exception` reste checked via `throw` / `throws`, tandis que `Fault` est unchecked, capturable et documentable par `faults` ;
- ajout du statement `fault` réservé aux descendants de `Fault` ;
- `catch` limité aux branches `Exception` et `Fault`, jamais `Error` ou `ResultError` ;
- `faults` défini comme clause optionnelle, non exhaustive et sans propagation obligatoire ;
- `throws` rendu indépendant du type de retour : une callable retournant directement `T` peut déclarer des exceptions checked ;
- suppression du principe « toute opération faillible doit retourner `Result` » ; `Result` reste réservé aux échecs explicitement transportés comme valeurs ;
- suppression des duplications automatiques `op()` / `tryOp()` lorsqu'elles ne diffèrent que par le canal d'échec ;
- conversions numériques canoniques migrées vers valeur directe + `NumericConversionFault` ;
- `NumericConversionError` remplacé par `NumericConversionFault`, avec `NotFinite`, `NotIntegral`, `OutOfRange`, `Inexact` ;
- conversions Unicode invalidables migrées vers valeur directe + `UnicodeEncodingFault`, sans familles `tryFrom`/`tryTo` parallèles mécaniques ;
- `PartialOrdering` séparé de `Ordering`; `Ordering` contient uniquement `Less`, `Equal`, `Greater` ;
- `Comparable<T>` et `Comparator<T>` retenus pour l'ordre naturel/principal et l'ordre externe ; un comparator explicite gagne toujours ;
- `Iterable<T>::iterator()` et `Iterator<T>::next() -> Option<T>` figés ; `Iterator<T>` reste distinct d'`Iterable<T>` ;
- ajout de `View<T> extends Iterable<T>` avec `count()` / `isEmpty()` et sans `contains()` obligatoire ;
- `Set<T>` / `ResizableSet<T>` fermés, avec `clear() -> uint64` ;
- `Map<K,V>` n'est pas directement `Iterable`; `keys()` / `values()` / `entries()` retournent des vues ;
- indexation map stricte `map[key] -> V`, `get(key) -> Option<V>`, affectation indexée limitée au remplacement d'une clé existante ;
- `ResizableMap` utilise `insert`, `remove`, `clear`, avec faults stricts au lieu de variantes `tryInsert` / `tryRemove` mécaniques ;
- `MapEntry<K,V>` reste une valeur de lecture et non un proxy mutable vers la map ;
- `SortedSet<T>`, `SortedMap<K,V>`, `TreeSet<T>` et `TreeMap<K,V>` définis en principe ; création par factories `natural()` / `withComparator()` ;
- les garanties concurrentes de collections restent orthogonales et relèvent du SDK (`ConcurrentMap`, etc.) sans symétrie artificielle ;
- le chapitre mémoire identifie désormais explicitement le sous-modèle pointeurs : références de classe, slices, pointeurs Saselang, raw/FFI et function pointers.
## 0.2.16
- `Array<T>` fixé comme séquence contiguë de longueur runtime fixe ;
- `StaticArray<T,N>` fixé comme séquence contiguë de longueur compile-time fixe ;
- `Slice<T>` défini comme vue contiguë fixe, non redimensionnable/non déplaçable et sans copie sémantique ;
- propagation de `const` vers les slices et leurs éléments, sans lifetimes utilisateur visibles ;
- initialisation complète obligatoire des arrays avant observation safe ;
- littéraux `[...]`, `filled`, `empty` et principe de `generate` définis ;
- `filled()` répète selon la sémantique normale de `T` et ne clone jamais implicitement les objets de classe ;
- `Collection<T>` distingue `count()` ; `List<T>` ajoute la sémantique de séquence et `length()` ;
- hiérarchie `Iterable -> Collection -> List -> SettableList -> ResizableList` retenue ;
- `List<T>` repose sur `OpIndex<uint64,T>` et `SettableList<T>` ajoute `OpIndexMut<uint64,T>` ;
- capacité intrinsèque et permission `const` explicitement séparées ;
- `String::substring()` produit une `String` sémantiquement indépendante tout en autorisant le partage physique interne ;
- aucun `StringView` introduit ni réservé ;
- ajout d'une couche de bibliothèques officielles `.saselib`, sans notion spéciale d'addon ;
- politique de bootstrap natif puis remplacement progressif par des saselib Saselang ;
- `saselang/mapdb*` retenu comme exemple de famille officielle spécialisée.
## 0.2.15
- mutabilité ordinaire confirmée par défaut ; aucun `mut` requis pour les variables/objets ordinaires ;
- `const` défini comme restriction d'accès locale : pas de réaffectation ni mutation via cet accès, sans immutabilité globale ;
- alias mutable -> alias const autorisé ; augmentation const -> mutable interdite pour les accès référence ;
- propagation `const` à travers les membres accédés depuis un receiver const ;
- introduction de `const method`, distincte de la pureté, et règles pour paramètres/retours const ;
- qualification `const` intégrée au contrat d'override/implémentation ;
- rejet explicite d'un modèle visible Rust-like basé sur immutabilité par défaut, `mut`, borrow/lifetimes ordinaires ;
- `String` mutable via API contrôlée ; `const String` bloque les mutations via cet accès ;
- intégration Core de `Utf8Char`, `Utf16Char`, `Utf32Char`, `Utf8String`, `Utf16String`, `Utf32String` ;
- `String` sans `[]`; `UtfXString[index]` lit une code unit brute et `OpIndexMut` reste absent ;
- aucune conversion/transcodage textuel implicite : conversion explicite avant `append`, concaténation ou autre opération ;
- ajout de l'annexe B pour les conversions Unicode/encodages.
## 0.2.14
- fermeture du socle generics V1 : syntaxe, inférence d'appel, contraintes nominales, invariance, absence de CTAD/wildcards/spécialisation ;
- `Numeric` retenu comme vraie abstraction Core utilisable dans les contraintes génériques ;
- const generics V1 limités aux types de paramètres `bool`, `char`, `uint8..uint256` et enums simples sans payload ;
- arguments const generic volontairement boring : aucune callable directement dans `<...>` ; calcul complexe matérialisé d'abord dans une `const` ;
- inférence const generic structurelle uniquement, sans solveur algébrique ;
- récursivité générique régulière autorisée ; auto-référence transformante et polymorphic recursion interdites V1 ;
- toute récursivité by-value interdite, y compris via une instanciation de taille théoriquement nulle ;
- cycles d'héritage interdits, diamants non cycliques autorisés ;
- classes récursives autorisées via leurs références d'objet ;
- distinction nominalement connu / sémantiquement complet / layout-complet et suppression du besoin de forward declarations utilisateur ;
- imports explicites requis même entre deux types du même namespace ; les imports sont déclaratifs, non exécutables, et leurs cycles sont autorisés ;
- `NaN`, infinities et zéros signés stabilisés pour `float -> float` ;
- `NumericConversionError` stabilisé conceptuellement autour de `NotFinite`, `NotIntegral`, `OutOfRange`, `Inexact` ;
- matrice `float -> integer` réduite par paire selon la règle anti-doublon ;
- conversions fondamentales Core obligatoires pour toute paire de types supportés, avec émulation logicielle lorsque raisonnable ;
- nomenclature de capabilities organisée par propriétaires `language.*`, `core.*`, `target.*`, `platform.*`, `sdk.*` ;
- V1/V2 explicitement positionnées comme bases/POC, V3 comme première baseline publique de stabilité.
## 0.2.13
- règle générale de composition Core figée : aucune méthode combinée lorsqu'une chaîne d'opérations existantes exprime exactement la même sémantique ;
- suppression conceptuelle des alias `tryFloorTo...`, `tryCeilTo...`, `tryRoundTo...` et `tryTruncateTo...` ;
- `float -> integer` réduit aux familles `tryTo...`, `trySaturateTo...` et `tryWrapTo...`, composables avec `floor()`, `ceil()`, `round()` et `truncate()` ;
- maintien des méthodes combinées uniquement lorsqu'une composition changerait le contrat ou perdrait l'information nécessaire ;
- `saturatingRoundToFloatXX()` reste justifié pour les conversions flottantes où arrondi et saturation ne peuvent pas être séparés sans changer la sémantique.
## 0.2.12
- migration de la Bible monolithique vers une distribution multifichier ;
- ajout d'un fichier compagnon examples / DO-DON'T par chapitre ;
- ajout des vues Language/Compiler, Language+Core et Platform ;
- ajout de l'annexe exhaustive des conversions numériques ;
- `is` figé comme test d'appartenance à une hiérarchie polymorphe ;
- `instanceof` figé comme test de classe runtime exacte, limité aux classes concrètes non abstraites ;
- upcast par assignabilité ; downcast canonique par `is` + refinement ;
- conversions numériques exposées par le Core plutôt que multipliées comme syntaxe compiler-specific ;
- `NumericConversionError` retenu comme nom de travail ;
- règle de non-redondance des variantes de conversion ;
- nom `saturatingRoundToFloatXX()` retenu lorsqu'arrondi et saturation doivent tous deux être annoncés ;
- modèle de livraison documentaire `full` + deltas SemVer.