Le plus grand changement : tout est vérifié avant l'exécution, et les types ne sont pas des indications facultatives. Le deuxième : l'indentation ne signifie rien — les blocs sont des accolades. Ce qui survit : du code lisible, l'interpolation, les littéraux de listes et de maps, et un REPL.
| Concept | Python | Keal |
|---|---|---|
| Liaison | x = 1 | val x = 1 |
| Réaffectable | x = 1; x = 2 | var x = 1 |
| Fonction | def add(a, b): return a + b | func add(a: Int, b: Int): Int { a + b } |
| Sans retour | def log(s): print(s) | proc log(s: String) { println(s) } |
| Liste | [1, 2] | [1, 2] |
| Dictionnaire | {"a": 1} | {"a": 1} |
| f-string | f"hello {name}" | "hello ${name}" |
| None | x = None | val x: String? = null |
| Classe | class C: def __init__(self, n) | class C(var n: Int) |
| Dataclass | @dataclass class P: x: float | record P(val x: Float) |
| Compréhension | [x*2 for x in xs] | xs.map({ it * 2 }) |
Vous annotez les paramètres et les champs ; le reste est déduit. Une incompatibilité est une erreur avant le démarrage, pas une surprise à la ligne 400.
Les méthodes ne prennent pas de paramètre receveur — this est disponible dans une classe, et c'est tout. (Dans les gestionnaires d'acteurs, un paramètre peut s'appeler self ; c'est un nom choisi par l'auteur, pas un mot-clé.)
Int fait 64 bits et le débordement panique au lieu de promouvoir. Float suit IEEE 754.
Même modèle, même angle mort : le cycle. CPython ajoute un ramasse-miettes ; Keal vous demande d'écrire weak sur l'arête arrière, et explique pourquoi dans son document mémoire.