Je viens de C++

Si vous écrivez du C++ moderne, l'essentiel du modèle mémoire de Keal vous est familier : shared_ptr partout, weak_ptr pour les cycles, des destructeurs déterministes. Ce qui disparaît, c'est le reste de la surface — pas de templates à instancier à la main, pas de résolution de surcharge, pas d'en-têtes, pas de comportement indéfini.

ConceptC++Keal
Objet partagéshared_ptr<T>the default
Référence faibleweak_ptr<T>weak var f: T?
Destructeur~T() { }proc deinit() { }
Struct valeurstruct P { double x; };record P(val x: Float)
Templatetemplate<class T> T f(T)func f<T>(x: T): T
Concepttemplate<Ord T>func f<T: Ord>(x: T)
Optionnelstd::optional<T>T?
Lambda[&](int x){ return x*2; }{ x -> x * 2 }
Exceptionthrow / catchthrow / catch
Surcharge d'opérateuroperator+trait Add
Espace de nomsnamespace a { }one flat namespace, for now

Ce qui vous surprendra

Des templates sans les erreurs d'instanciation

Les génériques sont vérifiés une fois à la déclaration, puis monomorphisés. Un générique qui typecheck compile à chaque instanciation — pas de pages d'erreurs venues d'un en-tête.

Pas de surcharge, un nom un sens

Les opérateurs viennent des traits, et un nom veut dire une chose dans une portée. Cela coûte un peu d'expressivité et rend la lecture d'un site d'appel possible.

Passez un .cpp sur la ligne keal build : il compile sous c++, le C généré reste C11, et seul l'édition de liens est partagée.

Déterministe, toujours

deinit s'exécute à la frontière d'instruction suivante, le plus jeune d'abord — l'ordre même où une pile d'objets RAII se déroule.