Si vous avez écrit du TypeScript, les annotations vous sembleront familières — mais elles ne sont pas effacées : elles compilent en dispositions mémoire et en code natif. Et les surprises que garde JavaScript ont disparu : une seule égalité, pas de coercition, pas d'undefined, pas de this qui change de sens selon l'appel.
| Concept | JavaScript | Keal |
|---|---|---|
| Liaison | const x = 1 | val x = 1 |
| Mutable | let x = 1 | var x = 1 |
| Fonction | function add(a, b) { return a + b } | func add(a: Int, b: Int): Int { a + b } |
| Flèche | xs.map(x => x * 2) | xs.map({ it * 2 }) |
| Tableau | [1, 2] | [1, 2] |
| Objet / Map | new Map([["a", 1]]) | {"a": 1} |
| Littéral gabarit | `hello ${name}` | "hello ${name}" |
| Test de nullité | x ?? "d" | x ?: "d" |
| Chaînage optionnel | x?.length | x?.length |
| Classe | class C { constructor(n) { } } | class C(var n: Int) |
| Promise | await f() | actors: spawn / send / run |
== compare des valeurs de même type ; il n'y a pas de === parce qu'il n'y a rien dont le distinguer. "1" + 1 ne devient pas silencieusement une chaîne — bien que "n = " + n soit permis et rende la valeur.
Une seule valeur absente, dans le type ou pas du tout. Une clé de map absente donne null, et le vérificateur vous oblige à la traiter.
Dans une méthode, this est l'instance. Il ne peut être relié, perdu dans un callback, ni masqué par une fonction fléchée.
Il n'y a ni bundler ni runtime à livrer : keal build émet du C11 et le confie à un compilateur C.