Que se passe-t-il avec camlp4 ?

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Récemment, j’ai souhaité me replonger dans l’interprétation, en commençant par me rafraîchir la mémoire sur l’analyse lexicale avec OCaml (version 4.08.1) et la manipulation des streams.

Je rencontre une erreur au chargement des modules usuellement appelés dans ce contexte :

#load "dynlink.cma" ;;
#load "camlp4o.cma" ;;
Cannot find file camlp4o.cma.

camlp4 ne semblait pas installé, j’ai donc lancé opam install camlp4 suivi de opam update et opam upgrade. Il me semble que l’installation s’est bien passée :

$ ocamlfind query camlp4
/home/titus/.opam/4.08.1/lib/ocaml/camlp4

Cependant, je rencontre la même erreur au chargement de camlp4o.cma dans le top-level OCaml. Dans le doute, j’ai voulu m’assurer que je ne travaillais pas sur une ancienne version d’OCaml mais il semblerait que non :

$ opam switch show
4.08.1

Cela correspond bien à la version pour laquelle camlp4 a été installée.

D’où une première question : mon installation et mon appel à camlp4 sont-ils corrects ? J’utilise opam très ponctuellement et quelque chose m’a peut-être échappé.

J’ai ensuite, de façon prétentieuse, supposé que le problème ne venait pas de moi. En faisant des recherches, je suis tombé sur un post sur ocaml.org. Ce message explique que camlp4 arrive en fin de vie et sera à terme remplacé par un outil du nom de ppx.

Je comprends du dernier paragraphe que les développeurs OCaml ne considèrent plus les streams comme un outil pertinent pour l’analyse lexicale, et nous encouragent à explorer d’autres solutions (mais j’ai peut-être mal compris…)

Cela signifie-t-il qu’il sera désormais impossible de faire tourner des codes appelant des pattern matching sur des stream, ou qui utilisent la notation [< >] ?

Y a-t-il un lien entre cette annonce (qui pourtant indique qu’une version de camlp4 est disponible pour OCaml 4.08) et mon problème ?

Merci d’avoir pris le temps de me lire et merci par avance pour vos réponses ! :)

Il y a plusieurs choses différentes à discuter:

  • Tu utilises des méthodes de compilation qui sont fragiles (elles supposent que camlp4o.cma est installé avec la bibliothèque standard, alors que c’est maintenant un paquet séparé) et d’un autre âge (à minima utiliser ocamlfind qui abstrait sur ces détails). C’est facile à corriger et tu auras du code qui marche en réponse à ce fil.

  • En effet, globalement camlp4 est déprécié aujourd’hui et n’est plus considéré comme une bonne solution. La communauté d’utilisateurs OCaml recommande ppx.

    Cette transition a commencé avec OCaml 4.01 en Septembre 2013, ce n’est pas nouveau; ton étonnement suggère que tu n’es pas un utilisateur actif de versions à jour d’OCaml, ce qui n’a rien de honteux, il faut que ça se passe bien même pour des utilisateurs occasionnels ou très non-spécialistes.

    Concrètement, Camlp4 est de moins en moins maintenu à jour depuis quelques années (tu as vu l’annonce de la fin du support en août 2019; c’est en fait toujours maintenu mais à petites doses), et finira par arrêter d’être facile à utilier sur une version à jour de OCaml. C’est utilisable aujourd’hui, mais pas une bonne approche sur le long terme.

  • Dans ce contexte, sur le moyen/long terme le choix le plus sain serait d’éviter d’utiliser l’extension syntaxique pour les streams ([< ... >] et parser). Ça veut dire soit faire le parsing sur les flux directement (en utilisant Stream ou une autre bibliothèque), ce qui est plutôt facile pour des parsers simples, soit utiliser une autre approche de parsing, par exemple Menhir ou des combinateurs de parsing.

Ceci étant dit, le plus simple pour corriger ton problème à court terme est d’utiliser ocamlfind, qui sait où trouver camlp4o.cma. Pour compiler un projet, il suffit de dire à ton outil de build d’ajouter le paquet camlp4. Dans le toplevel interactif:

  1. Si tu utilises ocaml, faire #use "topfind";; pour charger le support ocamlfind, et ensuite #camlp4o;; qui active les extensions syntaxiques dans le toplevel.
  2. Si tu utilises utop, un toplevel grandement amélioré (je t’invite à essayer), #use "topfind";; n’est plus nécessaire, utiliser #camlp4o;; directement devrait suffire.

Merci pour ta réponse @gasche.

Cette transition a commencé avec OCaml 4.01 en Septembre 2013, ce n’est pas nouveau; ton étonnement suggère que tu n’es pas un utilisateur actif de versions à jour d’OCaml

En effet. J’ai souvent eu l’impression, en regardant de loin les nouvelles versions d’OCaml, que les nouveautés ne concernaient que des gens « du milieu » et que j’avais encore beaucoup à faire avec les éléments de base du langage dont je dispose… ce qui explique que je ne traîne pas souvent sur ocaml.org (et c’est sûrement un tord !)

Dans ce contexte, sur le moyen/long terme le choix le plus sain serait d’éviter d’utiliser l’extension syntaxique pour les streams ([< ... >] et parser).

C’est noté ! J’ai pu lire ici et là par le passé que camlp4 était un outil intéressant justement pour cette extension syntaxique. Mais je comprends un peu mieux les raisons qui ont poussé la communauté OCaml à ne plus maintenir camlp4 en lisant ton post sur ocaml.org.

Et pour conclure sur le fond « technique » de ce topic, j’opte pour ta solution long terme en utilisant le module Stream de OCaml. Pour des parsers simples, la fonction Stream.next fera bien le travail dans un premier temps :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte