Je viens de C#

Les types référence nullables de C# sont optionnels et avertissent ; en Keal ils sont le système de types et ils refusent. Au-delà : pas d'héritage, pas de propriétés, pas de LINQ — mais les records, le filtrage par motifs et l'interpolation de chaînes vous sembleront familiers.

ConceptC#Keal
Recordrecord P(double X);record P(val x: Float)
Classeclass C { int N { get; set; } }class C(var n: Int)
Nullablestring? sval s: String?
Coalescences ?? "d"s ?: "d"
Accès conditionnels?.Lengths?.length
Switch à motifsn switch { 0 => … }when (n) { 0 -> … }
Motif de typeif (o is Circle c)when (o) { is Circle(r) -> … }
GénériqueT First<T>(List<T> xs)func first<T>(xs: List<T>): T
Interfaceinterface IOrdtrait Ord
Interpolation$"hello {name}""hello ${name}"
Asyncasync Task<T> / awaitactors: spawn / send / run

Ce qui vous surprendra

La nullité refuse, elle n'avertit pas

String et String? sont des types différents, toujours, sans option pour désactiver ni annotation à oublier.

Pas de propriétés, pas de travail caché

Un accès de champ est un accès de champ. Si quelque chose calcule, c'est une méthode et elle a des parenthèses.

Pas de LINQ, mais les méthodes sont là

map, filter, fold, et un pipeline paresseux Sequence écrit en Keal — rien ne s'exécute avant qu'une opération terminale ne tire.

Aucun runtime à installer

keal build produit un exécutable natif sans machine virtuelle dessous, et le compilateur lui-même n'a aucune dépendance.