summaryrefslogtreecommitdiff
path: root/content/Informatique/2013-09-13-ocaml_ppx.rst
blob: b6a0c102d325c5be8dbbd22bceab5d369481163a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
.. -*- mode: rst -*-
.. -*-  coding: utf-8 -*-

===========
ocamlc -ppx
===========

:date: 2013-09-13
:tags: ocaml, Programmation
:summary: |summary|
:logo: /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