Je viens de Kotlin

Keal a emprunté la silhouette de Kotlin à dessein : val/var, le ? dans le type, when, les smart casts, les data classes. Ce qu'il n'a pas emprunté : la JVM, les fonctions d'extension, les coroutines, et la seconde façon de dire les choses.

ConceptKotlinKeal
Liaisonval x = 1val x = 1
Data classdata class P(val x: Int)record P(val x: Int)
Nullableval s: String? = nullval s: String? = null
Appel sûrs?.lengths?.length
Elviss ?: "d"s ?: "d"
whenwhen (n) { 0 -> … }when (n) { 0 -> … }
Fonctionfun add(a: Int): Int = afunc add(a: Int): Int { a }
Fonction Unitfun log(s: String) { }proc log(s: String) { }
Lambdaxs.map { it * 2 }xs.map({ it * 2 })
Interfaceinterface Ordtrait Ord
Coroutinelaunch { … }sys.spawn({ self, msg -> … })

Ce qui vous surprendra

proc est la moitié manquante de func

Kotlin écrit fun f(): Unit ; Keal écrit proc f() et refuse qu'on utilise son non-résultat. Unit n'apparaît jamais dans un programme.

Ni fonctions d'extension, ni opérateurs par convention

Les opérateurs viennent de huit traits (Add, Ord, …) que votre type implémente explicitement. Il y a un seul endroit où chercher ce que + veut dire.

La concurrence, ce sont des acteurs, pas des coroutines

spawn d'un gestionnaire, send de messages, run. Compilé nativement, chaque acteur est un thread système ; les interpréteurs exécutent un ordonnancement déterministe, et les deux impriment les mêmes octets.

La logique s'écrit en toutes lettres

and, or, not — plus xor, nand, nor, xnor et implies, tous à une seule précédence : les expressions mixtes demandent des parenthèses.

Les bits aussi

band, bor, bxor, bnot, shl, shr, ushr. Kotlin les écrit aussi en toutes lettres ; Keal ajoute qu'ils ne se mélangent à rien sans parenthèses, et qu'ils lient plus fort que == — donc flag band 2 != 0 veut dire ce qu'il a l'air de vouloir dire.