vendredi 17 février 2012

Kotlin : premiers essais avec IntelliJ IDEA

Cette semaine, Jetbrains a mis disposition le code source de Kotlin sur Github.
On peut y télécharger le runtime, le compilateur et un plugin pour IntelliJ IDEA (attention, il faut la dernière version 'EAP' de l'IDE pour que cela fonctionne).
Voyons ensemble comment essayer ce nouveau langage en quelques lignes de code.



Une fois le plugin IDEA installé, on peut créer un nouveau fichier Kotlin en utilisant menu "New" --> "Kotlin file" L'IDE demandera alors le chemin vers le runtime Kotlin. Après avoir renseigné ce chemin, on peut commencer à coder!

Pour commencer, on crée une méthode main :

fun main(args : Array<String>) {
}

Testons maintenant quelques fonctionnalités. La fonction 'filter' disponible sur les collections prend en paramètre une autre fonction :

    val list1 = arrayList(1, 2, 3, 4, 5)
    println(list1.filter{it -> it>2})

Cette fonction est disponible même sur les collections Java (ici on manipule une ArrayList) grâce au mécanisme d'extension de Kotlin (voir doc).
Dans notre exemple, la fonction passée en paramètre demande de ne retourner que les nombres superieurs à 2. La sortie sera donc : 3,4,5

Comme cette fonction ne prend qu'un paramètre, on peut simplifier son écriture comme ceci :

 println(list1.filter{it>2})

La fonction 'map' transforme une collection en une autre collection en appliquant une fonction à chaque élément :
    val list2 = arrayList("bob", "joe", "john")
    println(list2.map{
        "Hello " + it.toUpperCase()
    })

On peut noter que l'inférence de type fonctionne bien dans l'IDE. En effet, après le mot 'it' IDEA nous propose toutes les fonctions relatives au type String, qu'il a pu déterminer en analysant la construction de la list 'list2'.
Note : on aurait pu écrire explicitement le type de cette liste de cette manière : val list2: Array<String> = arrayList("bob", "joe", "john")

Dans un style plus "framework Web", définission maintenant une fonction 'get' qui prend en paramètre une route (une URL) et une fonction à exécuter lors de l'appel de cette URL :
fun get(route: String, process : () -> String) {
    val response = process()
    println("added route $route : " + response)
}

Note : on observe au passage la syntaxe '$route' qui permet d'insérer une expression dans un string.

Kotlin permet de passer le corps d'une fonction à l'exterieur des parenthèses si cette fonction est le dernier paramètre de la fonction englobante.
Derrière cette phrase compliquée, on peut voir que l'on peut appeler notre fonction comme ceci :

    get("/hello") {
        val name = "bob"
        "<h1>hello $name</h1>"
    }

On a donc une fonction 'get' qui peut être appelée en utilisant la même structure que 'map', 'filter' ou même qu'une simple boucle 'while'. En exécutant le code ci-dessus, on a bien "<h1>hello bob </h1>" dans la console.

En conclusion, ce premier aperçu est plutôt positif, l'IDE répond bien et semble tout à fait fonctionnel pour une preview. En plus, l'équipe de Kotlin a annoncé vouloir faire fonctionner Play Framework avec Kotlin! 

Pour en savoir plus sur ce langage, vous pouvez visiter cette page et découvrir d'autres fonctionnalités comme le pattern matching, les properties, les generics (bien plus puissants qu'en Java)... Et si vous avez la flemme de configurer IntelliJ IDEA, vous pouvez toujours jouer avec la Web Demo!