Je viens de Rust

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.

ConceptRustKeal
Liaisonlet x = 1;val x = 1
Mutablelet mut x = 1;var x = 1
Structstruct P { x: f64 }record P(val x: Float)
OptionOption<String>String?
Unwrap ou défautopt.unwrap_or(d)opt ?: d
Matchmatch n { 0 => … }when (n) { 0 -> … }
Borne de traitfn f<T: Ord>(x: T)func f<T: Ord>(x: T)
Fermeture|x| x * 2{ x -> x * 2 }
ResultResult<T, E> + ?try { } catch (e) { }
Rc / WeakRc<T> / Weak<T>the default / weak var f: T?
Threadsstd::thread::spawnsys.spawn({ self, msg -> … })

Ce qui vous surprendra

Ni durées de vie, ni vérificateur d'emprunts

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.

weak est l'idée que vous connaissez déjà

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.

Les erreurs déroulent au lieu de se propager

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.