Posted on :: Min Read :: Tags: ,

Contexte

Un sujet que l'on retrouve souvent quand on aborde la programmation fonctionnelle est celui de la théorie des graphes. En bref, cette discipline présente des modèles abstraits de dessins de réseaux reliant des objets.

Beaucoup d’algorithmes sur les graphes s’expriment bien de manière récursive, principe que l'on retrouve essentiellement dans ce paradigme. En clair, il s'avère que la programmation fonctionnelle offre une approche plutôt naturelle pour modéliser mathématiquement les graphes.

Maintenant, la théorie, c'est sympa, mais on veut pouvoir voir les graphes que l'on crée.

Pour cela, dans les cours de programmation fonctionnelle dispensés à l'ensIIE, nous sommes introduits au module Graphics d'OCaml. On peut alors installer ce module avec un gestionnaire de paquets appelé OPAM (grosso-modo, c'est la même chose que pip avec Python).

J'ai souvent entendu des personnes avoir des difficultés à utiliser OPAM, et alors haïr le projet de cette matière car "c'est trop dur à faire marcher".

Mon objectif à travers ce post va être de clarifier le fonctionnement d'OPAM pour vous permettre de réaliser le projet en toute tranquilité, et pour que votre seul problème dans ce projet soit votre code. :)

pip vs OPAM, c'est quoi la différence ?

Nous n'allons pas passer trop de temps pour comprendre toutes les différences entre ces deux gestionnaires de paquet. Ce qui va nous intéresser ici est de savoir comment sont stockés les modules qu'on télécharge.

pip

Quand on fait which pip, cela permet de savoir quel exécutable on va utiliser pour appeler notre gestionnaire de paquet (par exemple, ici, /usr/bin/pip3).

Afin de limiter les problèmes de dépendance d'un projet à un autre, nous sommes amenés à utiliser un environnement virtuel (qu'on va appeler dans la suite venv).

Ainsi, chaque venv possède ses paquets avec sa version des paquets (ou même de Python).

On crée notre venv de la manière suivante :

$ cd /tmp # Pour tester la création de notre venv
$ which python3
/usr/bin/python3
$ which pip3
/usr/bin/pip3
$ python3 -m venv myVenv # Création de mon venv
$ ls myVenv
bin  include  lib  lib64  pyvenv.cfg

À présent, on souhaite utiliser ce venv associé à notre projet.

$ source myVenv/bin/activate # On active le venv
$ which python3
/tmp/myVenv/bin/python3
$ which pip3   
/tmp/myVenv/bin/pip3

Comme on peut le voir, nous avons changé d'environnement.

À présent, tous les includes et toutes les bibliothèques que nous utiliserons seront celles présentes dans les dossiers /tmp/myVenv/include et /tmp/myVenv/lib.

Après, on peut simplement interpréter le fichier avec une commande du style python3 file.py.

OPAM

Avec OPAM, ça ne marche pas vraiment de la même façon.

En effet, on ne parle pas d'environnement virtuel mais de switch.

De ce fait, chaque switch regroupe ses propres paquets.

Avant toute chose, nous devons initialiser OPAM.

opam init

Tous les switchs que l'on crée sont présents dans ~/.opam. Le switch par défaut est default.

$ ls ~/.opam/default
bin   doc   etc   lib   man   sbin  share var

Ainsi, une bonne habitude à prendre quand on développe une application ou une fonctionnalité est de créer son propre switch pour le projet.

opam switch create prfo_project ocaml.4.13.1 # On précise la version d'OCaml qu'on souhaite utiliser

Ainsi, le nouveau switch est créé dans ~/.opam.

$ opam switch # Pour montrer la liste des switchs créés
#  switch        compiler      description
  default       ocaml.5.2.1   default
   prfo_project  ocaml.4.13.1  prfo_project

On peut alors changer de switch.

$ opam switch show # Montrer le switch courant
default
$ opam switch prfo_project
$ eval $(opam env) # Mise à jour les variables d'environnement du terminal
$ opam switch show # Montrer le switch courant
prfo_project

Une fois qu'on est dans le switch souhaité, on peut alors installer notre module Graphics.

$ sudo apt install pkg-config # Paquet nécessaire pour installer graphics, libre à vous d'utiliser votre gestionnaire de paquet préféré
$ opam install graphics # Installation du module graphics

Note : tant que vous tentez d'installer les paquets avec OPAM seulement, vous ne devrez rien casser. Donc utilisez seulement les commandes OPAM pour ajouter vos paquets dans un switch.

Bonus : utiliser le module Graphics

Compilation

La ligne de commande pour compiler nos fichiers dépend d'une option : -I.

  • -I permet de spécifier le dossier dans lequel il y a tous nos includes (donc ici, les fichiers au format .cmi/.cmo/.cma)

Ainsi, si on veut compiler un fichier qui utilise le module Graphics, on fera une commande du style :

ocamlc -I ~/.opam/prfo_project/lib/graphics graphics.cma display.ml

Erreur

  • Si vous rencontrez l'erreur Unbound module Graphics, c'est que vous êtes soit dans le mauvais switch, soit que vous avez mal installé le module Graphics. Reprenez alors les directives précédentes.
  • Si vous rencontrez l'erreur Corrupted compiled interface, sachez que je l'ai aussi rencontré et que je n'ai pas réussi à corriger ce problème (MacOS). Je n'oserai pas dire qu'il faut par conséquent passer par un conteneur pour réaliser le TP, mais...