abracadabra ! Incanter


Incanter logo
Et voilà, j’ai a nouveau un paquet de résultats de test à analyser. Une bonne occasion d’évaluer Incanter.
Incanter se définit comme « a Clojure-based, R-like platform for statistical computing and graphics. ».

Un R-like ? R est une plate-forme et un langage dérivé de Scheme (lui même dérivé de LISP) qui permet de manipuler facilement des données statistiques (les lire depuis une source, les filtrer, calculer des moyennes, afficher ces valeurs sous forme de courbe ou d’histogramme, et bien d’autres fonctions pour statisticiens). Ok, mais ça fait à peu près ce que fait Excel. Oui, mais sous forme de langage ce qui permet de scripter bien plus facilement et surtout permet de traiter de grosses masses de données sans devoir les afficher.

Quel est le problème avec R ? C’est un outil génial mais qui existe dans un éco-système différent de Java et ne permet pas de réutiliser tout ce que l’on connait. Il est un peu lent et c’est un mix entre programmation fonctionnelle et C parfois un peu déroutant. Mais il bénéficie d’une communauté beaucoup plus grande et de beaucoup plus de fonctions que son challenger. Et puis quand même Incanter : Data Sorcery c’est indispensable d’aller voir.

Et c’est une bonne occasion de se mettre à Clojure aussi. Pour ceux et celles qui n’auraient pas fait de veille depuis 2 ans, Clojure est un dialecte de LISP (avec des (parenthèses) partout) qui tourne dans la JVM.

On s’y met

Assez tourné autour du sujet. Maintenant il faut regrouper quelques épices et mettre les mains dans le chaudron.

Pour commencer, il faut un environnement Clojure. Vu que le but c’est d’utiliser Incanter, autant utiliser la solution de fainéant avec un kit de magicien.

http://incanter.org/downloads/

Et une incantation ! (enfin un clic sur l’icône)
Mmm … non c’est bien ça.
Certes …
Effectivement, un R-like (encore que dans l’environnement R il y a deux ou trois trucs dans le menu).

incanter shell

J’ai bien réussi à faire une copie d’écran sur un Mac. Pas de soucis (encore que WordPress s’obstine a formater le code préformaté).

Le shell Clojure est un environnement interactif qui lit, evalue et affiche le résultat des expressions qu’on lui soumet. Il est souvent désigné  sous le nom REPL.

Tentons quelques trucs.

Clojure 1.2.0-master-SNAPSHOT
user=> (1+1)
java.lang.NumberFormatException: Invalid number: 1+1 java.lang.Exception: Unmatched delimiter: )
user=> ()
()
user=>

Soyons positifs, () marche … même si ça n’est pas très utile.

B-A-BA Clojure

Bon, commençons par le commencement, lire la doc. Vous trouverez des ressources sur http://data-sorcery.org/ qui est en fait le blog de incanter.org. Un peu trop compliqué de prime abord. J’ai trouvé là http://www.chicoree.fr/w/Premiers_pas_avec_Clojure un tutorial très progressif même si c’est appliqué à un sujet différent. J’en ai repris quelques éléments.

On veut manipuler des données. Donc on va faire des opérations sur des nombres. Comment on fait une opération ?

user=> (+ 1 2)
3

Et oui, en Clojure, les opérateurs sont préfixés.

Clojure est un langage homoiconique, il représente les programmes comme des structures de données. Le programme est donc représenté par une liste d’éléments. D’un point de vue plus technique, c’est une S-expression, c’est à dire une séquence de termes entre parenthèses. Le premier terme est la fonction à appliquer et les termes suivants sont des arguments. N’importe quel terme peut être une sous-expression. L’opérateur + est une fonction comme une autre.

Ce qui  permet d’écrire un suite d’additions en passant la liste des valeurs ou d’appliquer une méthode à un objet (vous noterez le . et le fait que la méthode précède la chaîne à laquelle elle s’applique).

user=> (+ 1 2 3)
6
user=> (.toUpperCase "Hello")
"HELLO"

Conséquence de ce principe, il n’y pas de règles de précédence des opérateurs en Clojure, l’opérateur ne peut se trouver qu’au début de la séquence.

user=> (+ 1 (* 2 3))
7
user=> ; 1 + 2*3

Le symbole qui marque le début d’un commentaire est ;

Il existe aussi des fonctions prédéfinies telles que print ou println similaires au méthodes Java. Vous noterez que les , entre les termes sont facultatives.

user=> (print "Hello")
Hellonil
user=> (println "Hello", "Claude")
Hello Claude
nil
user=> (println "Hello" "Claude")
Hello Claude
nil

Mais d’ou sort ce nil ?

Les fonctions print n’ont pas de valeur de retour à la différence de +. L’affichage du texte est un effet de bord de la fonction. nil sert à plusieurs choses en Clojure, mais en particulier à exprimer la fin de séquence et le rien.

Encore quelques détails et nous voilà prêts à écrire Hello World.

Hello World !

Une fonction se définit en utilisant la fonction fn suivi des paramètres entre crochets et d’une expression qui définit le résultat à produire. Et le nom ? Est ce bien nécessaire d’avoir un nom ?

user=> (fn [name] (println "Hello" name))
#<user$eval61$fn__62 user$eval61$fn__62@10e9df>
user=> ( (fn [name] (println "Hello" name)) "Claude" )
Hello Claude
nil

Cette fonction anonyme est utilisable (enfin, pour peu qu’on mettre les parenthèses au bon endroit). Finalement, un nom c’est pratique. On va associer cette fonction à un nom en utilisant la même syntaxe que pour déclarer toute variable, la fonction def.

user=> (def moi "Claude")
#'user/moi
user=> (type moi)
java.lang.String
user=> (println moi)
Claude
nil

Et maintenant la fonction hello :

user=> (def hello (fn [name] (println "Hello" name)) )
#'user/hello

La fonction doc retourne des informations sur la fonction. A noter aussi plus haut, la fonction type.

user=> (doc hello)
-------------------------
user/hello
nil
   nil
nil
user=> (doc println)
-------------------------
clojure.core/println
([& more])
   Same as print followed by (newline)
nil

En pratique, les fonctions sont plutôt déclarées de la manière suivante, grace à la macro defn qui regroupe les deux étapes.

Hello world en Clojure.

user=> (defn hello [name] (println "Hello", name))
user=> (hello "Claude")
Hello Claude
nil

Et Incanter ?
Houlà !!! vous êtes bien pressé jeune sorcier. Il nous reste à voir les collections et quelques concepts secrets. Mais à chaque jour suffit sa peine. C’est tout pour aujourd’hui. La suite dans l’épisode 2.

5 réflexions sur “abracadabra ! Incanter

  1. Pingback: 1, 2, 3 . . . Incanter « Claude au pays des 4J

  2. Salut Claude ! Comment ça va, depuis mix-it ?

    Bien content de voir une belle série d’articles démarrer sur Incanter et Clojure ! Je te souhaite autant de plaisir que j’en ai eu à découvrir ce langage.

    « Keep up the good work! »🙂

  3. Pingback: supercalifragilisticexpialidocious Incanter-3 « Claude au pays des 4J

  4. Pingback: Alohomora Incanter-4 « Claude au pays des 4J

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s