Author: Christian.Queinnec@lip6.fr

## Pour en savoir plus

Bien qu'en programmation graphique et événementielle, le style de programmation soit impératif, il est non seulement possible, mais bien souvent utile, d'introduire des opérateurs plus fonctionnels de manipulation d'objets graphiques. Un bon exemple vient de l'utilisation de la bibliothèque `MLgraph`,

### Lien

http://www.pps.jussieu.fr/~cousinea/MLgraph/mlgraph.html

qui implante le modèle graphique de PostScript, et propose des opérateurs fonctionnels de manipulation des images. Elle est décrite dans [CCS96] et utilisée abondamment dans [CM95] pour le placement optimisé des arbres et pour la construction de dessins dans le style d'Escher.
Une caractéristique intéressante de la bibliothèque `Graphics` est d'être portable pour les interfaces graphiques des systèmes Windows, MacOS et Unix. Cette notion de bitmap virtuel se retrouve dans plusieurs langages comme Le_Lisp ou plus récemment en Java. Malheureusement en Objective CAML la bibliothèque `Graphics` ne possède pas de composant interactif pour la construction d'interfaces. Une des applications décrites dans la partie II de ce livre contient les premières briques de la bibliothèque `Upi`. Celle-ci s'inspire de l'Abstract Windowing Toolkit des premières versions de Java. On s'aperçoit qu'il est relativement aisé d'étendre des fonctionnalités de cette bibliothèque grâce aux valeurs fonctionnelles du langage. Le chapitre 16 compare d'ailleurs l'adaptation de la programmation objet et de la programmation fonctionnelle et modulaire pour la construction d'interfaces graphiques. L'exemple d'`Upi` est fonctionnel et impératif, mais il est aussi possible de n'utiliser que le style fonctionnel. C'est typiquement le cas pour les langages fonctionnels purs. On peut citer les systèmes `Fran` et `Fudget`, développés en Haskell et dérivés. Le système `Fran` permet de construire des animations 2D, 3D interactives, c'est-à-dire avec événements entre objets animés ou utilisateurs.

### Lien

http://www.research.microsoft.com/~conal/fran/

La bibliothèque `Fudget` est une bibliothèque pour la construction d'interfaces graphiques.

### Lien

http://www.cs.chalmers.se/ComputingScience/Research/Functional/Fudgets/

Une des difficultés, quand on veut programmer une interface graphique pour son application, est de savoir laquelle choisir parmi les nombreux outils existants. Il ne suffit pas de déterminer le langage et le système pour fixer le choix de l'outil. Pour Objective CAML, il en existe plusieurs plus ou moins finalisés :

- l'encapsulation de la `libX`, pour X-Windows;
- la `librt`, une bibliothèque pour X-Windows;
- `ocamltk`, adaptation de `Tcl/Tk`, portable;
- `mlgtk`, adaptation de `Gtk`, portable.

On trouve les liens vers ces développements à la << bosse du chameau >> :

### Lien

http://caml.inria.fr/hump.html

Enfin nous avons parlé uniquement de la programmation en 2D. La tendance est à l'augmentation d'une dimension. Que cela soit le modèle VRML, ou l'extension Java-3D, les langages fonctionnels doivent aussi répondre à cette nécessité. En fonctionnel pur, le système `Fran` offre des possibilités intéressantes d'interaction entre sprites. Plus proche d'Objective CAML on peut utiliser la bibliothèque `VRcaML` ou l'environnement de développement SCOL.
À la manière de `MLgraph` a été développée la bibliothèque `VRcaML` qui intègre une partie du modèle graphique de VRML à Objective CAML.

### Lien

http://www.pps.jussieu.fr/~emmanuel/Public/enseignement/VRcaML

On peut donc construire une scène 3D animée. Le résultat produit alors un fichier VRML directement visualisable.
Toujours dans la lignée de Caml, le langage SCOL, est un langage fonctionnel de communication muni d'importantes bibliothèques de manipulation 2D et 3D agrémenté d'un environnement de développement pour le non-informaticien.

### Lien

http://www.cryo-networks.com

L'intérêt du langage SCOL et de son environnement de développement est de pouvoir réaliser des applications réparties, en client-serveur, facilitant la fabrication de sites Internet. On présente la programmation distribuée en Objective CAML au chapitre 20.