2017-08-28 6 views
3

Comment puis-je dériver des méthodes to_string pour les types de données en utilisant ppx avec jbuilder?comment dériver des méthodes to_string pour les types de données en utilisant ppx

Par exemple, je suis en train d'utiliser @@deriving show pour dériver show_* méthodes pour un type de données. J'ai un simple fichier main.ml qui ressemble à ceci:

open Core 

type foo = Bar | Baz 
    [@@deriving show] 

let() = printf "%s\n" (show_foo Bar) 

J'ai un fichier jbuild dans le même répertoire qui ressemble à ceci:

(jbuild_version 1) 

(executables 
((names (main)) 
    (libraries (core ppx_deriving)) 
    (preprocess (pps (ppx_deriving.show))))) 

(install 
((section bin) 
    (files ((main.exe as my_foo))))) 

Quand je lance jbuilder build, je reçois l'erreur suivante:

File "main.ml", line 6, characters 24-32: 
Error: Unbound value show_foo 

Il semble que jbuilder ne fonctionne pas ppx_deriving.show préprocesseur, et ne génère pas e e show_foo fonction.

Mon utilisation de @@derive show est-elle correcte? Ai-je besoin d'ajouter quelque chose à mon fichier jbuild pour le faire fonctionner correctement? Est-ce que ppx_deriving a un problème de travail avec jbuilder? Dois-je utiliser une bibliothèque ppx différente? Dois-je utiliser un système de construction différent? Comment la plupart des OCamlers traitent-ils ces problèmes de système de construction?


modifier: J'utilise la version OCaml 4.04.2, version 1.0 + JBuilder beta11 et ppx_deriving version 4.1.

+0

Lors de la publication de questions sur 'jbuilder', il est nécessaire d'inclure un fichier' * .opam'? Est-ce que 'jbuilder' regarde ce fichier pour comprendre comment construire l'exécutable? – illabout

+1

J'ai juste essayé de mettre à jour 'jbuilder' et' ppx_deriving' et maintenant cela semble fonctionner. Ma version 'jbuilder' est [1.0 + beta12] (https://github.com/janestreet/jbuilder/blob/1c85e646bc732189739e31e697b5e60bbd2221ba/CHANGES.md#10beta12-18082017) et' ppx_deriving' est la version [4.2] (https: // github.com/ocaml-ppx/ppx_deriving/blob/7969277d1ec02517f441930e449d115d64a2a778/CHANGELOG.md#42). – illabout

+0

En utilisant les deux versions de paquetage ci-dessus, ce code fonctionne également avec la version OCaml '4.05.0'. – illabout

Répondre

3

Comme vous avez pu le constater dans les commentaires, cela nécessite un traitement particulier dans ppx_deriving qui n'a été fusionné que dans la version 4.2.

La raison sous-jacente est que jbuilder utilise ppx_driver pour appliquer des réécriteurs ppx et non l'indicateur -ppx.