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.
| Concept | C# | Keal |
|---|---|---|
| Record | record P(double X); | record P(val x: Float) |
| Classe | class C { int N { get; set; } } | class C(var n: Int) |
| Nullable | string? s | val s: String? |
| Coalescence | s ?? "d" | s ?: "d" |
| Accès conditionnel | s?.Length | s?.length |
| Switch à motifs | n switch { 0 => … } | when (n) { 0 -> … } |
| Motif de type | if (o is Circle c) | when (o) { is Circle(r) -> … } |
| Générique | T First<T>(List<T> xs) | func first<T>(xs: List<T>): T |
| Interface | interface IOrd | trait Ord |
| Interpolation | $"hello {name}" | "hello ${name}" |
| Async | async Task<T> / await | actors: spawn / send / run |
String et String? sont des types différents, toujours, sans option pour désactiver ni annotation à oublier.
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.
map, filter, fold, et un pipeline paresseux Sequence écrit en Keal — rien ne s'exécute avant qu'une opération terminale ne tire.
keal build produit un exécutable natif sans machine virtuelle dessous, et le compilateur lui-même n'a aucune dépendance.