La chaîne d'outils est écrite en Rust, la dette est donc reconnue. Mais Keal a fait le choix mémoire inverse : comptage de références au modèle documenté plutôt qu'un vérificateur d'emprunts. On renonce aux garanties d'aliasing à la compilation ; on gagne un langage sans durées de vie à écrire.
| Concept | Rust | Keal |
|---|---|---|
| Liaison | let x = 1; | val x = 1 |
| Mutable | let mut x = 1; | var x = 1 |
| Struct | struct P { x: f64 } | record P(val x: Float) |
| Option | Option<String> | String? |
| Unwrap ou défaut | opt.unwrap_or(d) | opt ?: d |
| Match | match n { 0 => … } | when (n) { 0 -> … } |
| Borne de trait | fn f<T: Ord>(x: T) | func f<T: Ord>(x: T) |
| Fermeture | |x| x * 2 | { x -> x * 2 } |
| Result | Result<T, E> + ? | try { } catch (e) { } |
| Rc / Weak | Rc<T> / Weak<T> | the default / weak var f: T? |
| Threads | std::thread::spawn | sys.spawn({ self, msg -> … }) |
Chaque valeur du tas est comptée, comme si tout était Rc. L'affectation partage ; il n'y a pas de sémantique de déplacement à raisonner, ni rien à annoter.
Un cycle est la seule chose que le comptage ne peut libérer, et weak var est Weak<T> avec l'upgrade fait pour vous : la lecture donne la cible tant qu'elle vit, null ensuite.
Il n'y a ni opérateur ? ni Result : un échec lance, et catch lie le message. Le débordement entier panique aussi en compilation optimisée.
Compilez une staticlib, déclarez les symboles avec extern func, passez le .a à keal build.