.. -*- mode: rst -*- .. -*- coding: utf-8 -*- =========== ocamlc -ppx =========== :date: 2013-09-13 :tags: ocaml, Programmation :summary: |summary| :logo: static/images/ocaml/recursion_75.jpg .. figure:: |filename|/images/ocaml/recursion.jpg :figwidth: 180 :figclass: floatright :alt: Recursivité Image : `Gadl`_ (creativecommons_) .. _Gadl: http://www.flickr.com/photos/gadl/279433682/ .. _creativecommons: http://creativecommons.org/licenses/by-sa/2.0/deed.fr |summary| .. |summary| replace:: Les langages homoïconiques ont quelque chose de fascinant : pouvoir représenter le programme sous la forme d'une donnée capable d'être traitée par le programme nous entraîne dans un jeu de mirroirs qui se réfléchissent eux-même, et me donne un peu le vertige… La nouvelle version d'OCaml présente une option de préprocessing qui s'en rapproche. Selon `wikipédia`_ un langage homoïconique à la particularité de pouvoir être représenté comme une donnée du programme. Cela permet de transformer le langage (lui donner de nouvelles fonctionalités) en utilisant un autre programme fait dans le même langage. Un programme lisp peut ainsi se modifier durant son exécution, de la même manière, un fichier xsl peut s'appliquer sur un autre fichier xsl (puisque xslt_ est décrit sous la forme de fichiers xml)… .. _wikipédia: https://fr.wikipedia.org/wiki/Homoiconicit%C3%A9 .. _xslt: https://fr.wikipedia.org/wiki/Extended_stylesheet_language_transformations OCaml 4.01 est sorti ! ====================== OCaml vient de sortir en version 4.01, et présente dans ses nouveautés, une nouvelle option qui s'active à la compilation : :-ppx command: After parsing, pipe the abstract syntax tree through the preprocessor command. The format of the input and ouput of the preprocessor are not yet documented. Qu'est-ce que cela signifie ? Qu'après avoir interprété le programme source et construit l'arbre syntaxique du langage, le compilateur appelle un autre programme en lui transmettant cette représentation en paramètre. À cette étape, le compilateur a juste vérifié que la syntaxe était `valide`, mais il n'a pas encore vérifié le programme. Le programme appellé peut alors modifier la représentation du code source, et **doit** donner en retour un programme OCaml valide (si l'on veut que le code compile…). Cela permet d'étendre la syntaxe du langage en se basant sur des éléments de syntaxe valides pour mettre en place un `langage dédié`_ (par exemple). Est-ce que cela fait d'OCaml un langage homoïconique ? Non, car cela n'est prévu pour être le cœur d'OCaml, mais cela lui donne un aspect homoïconique et de nouvelles perspectives dans l'évolution du langage. Le principal avantage vient du fait que le langage OCaml est TRÈS fortement typé, et refusera de compiler si une erreur s'est glissée dans la cohérence du programme. On peut donc modifier le programme sans crainte de provoquer une erreur dans la structure de celui-ci. .. _langage dédié: https://fr.wikipedia.org/wiki/Domain-specific_programming_language Des exemples ============ OMonad_ est une extension qui donne ainsi à OCaml la possibilité de traiter les monades selon la syntaxe issue d'Haskell. .. _OMonad: http://danmey.org/omonad.html `ppx tools`_ est une librairie qui permet de construire sa propre extension, écrite par Alain Frish, l'auteur à qui l'on doit cette nouvelle option. Il décrit son besoin et son usage sur son blog_. .. _ppx tools: https://github.com/alainfrisch/ppx_tools .. _blog: http://www.lexifi.com/blog/syntax-extensions-without-camlp4-lets-do-it Certe, il était déjà possible de faire des choses `très amusantes`_ avant ça, mais cela restait encore expérimental. Maintenant, cela devient beaucoup plus accessible. Je ne connais pas beaucoup de langages qui poussent aussi loin la possibilité de modifier le compilateur pour l'adapter à ses besoins, et rien que pour ça, je trouve ça fun ! |:-)| .. _très amusantes: https://bitbucket.org/camlspotter/compiler-libs-hack .. |:-)| image:: |filename|/images/icons/face-smile.png