Je viens de Python

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.

ConceptPythonKeal
Liaisonx = 1val x = 1
Réaffectablex = 1; x = 2var x = 1
Fonctiondef add(a, b): return a + bfunc add(a: Int, b: Int): Int { a + b }
Sans retourdef log(s): print(s)proc log(s: String) { println(s) }
Liste[1, 2][1, 2]
Dictionnaire{"a": 1}{"a": 1}
f-stringf"hello {name}""hello ${name}"
Nonex = Noneval x: String? = null
Classeclass C: def __init__(self, n)class C(var n: Int)
Dataclass@dataclass class P: x: floatrecord P(val x: Float)
Compréhension[x*2 for x in xs]xs.map({ it * 2 })

Ce qui vous surprendra

Les types ne sont pas des indications

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.

Il n'y a pas de self

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é.)

Les entiers ne grandissent pas indéfiniment

Int fait 64 bits et le débordement panique au lieu de promouvoir. Float suit IEEE 754.

Comptage de références, comme CPython

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.