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.
| Concept | Kotlin | Keal |
|---|---|---|
| Liaison | val x = 1 | val x = 1 |
| Data class | data class P(val x: Int) | record P(val x: Int) |
| Nullable | val s: String? = null | val s: String? = null |
| Appel sûr | s?.length | s?.length |
| Elvis | s ?: "d" | s ?: "d" |
| when | when (n) { 0 -> … } | when (n) { 0 -> … } |
| Fonction | fun add(a: Int): Int = a | func add(a: Int): Int { a } |
| Fonction Unit | fun log(s: String) { } | proc log(s: String) { } |
| Lambda | xs.map { it * 2 } | xs.map({ it * 2 }) |
| Interface | interface Ord | trait Ord |
| Coroutine | launch { … } | sys.spawn({ self, msg -> … }) |
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.
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.
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.
and, or, not — plus xor, nand, nor, xnor et implies, tous à une seule précédence : les expressions mixtes demandent des parenthèses.
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.