2017-08-28 12 views
3

Wie kann ich to_string Methoden für Datentypen mit ppx mit jbuilder herleiten? Zum Beispiel versuche ich @@deriving show zu verwenden, um Methoden für einen Datentyp abzuleiten. Ich habe eine einfache main.ml-Datei, die wie folgt aussieht:Wie abgeleitet to_string Methoden für Datentypen mit ppx

open Core 

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

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

Ich habe eine jbuild-Datei in demselben Verzeichnis, das wie folgt aussieht:

(jbuild_version 1) 

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

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

Als ich jbuilder build laufen, ich folgende Fehlermeldung erhalten:

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

Es scheint wie jbuilder laufen nicht den ppx_deriving.show Präprozessor und erzeugt keine th e show_foo Funktion.

Ist meine Verwendung von @@derive show korrekt? Muss ich etwas zu meiner jbuild Datei hinzufügen, damit es richtig funktioniert? Hat ppx_deriving ein Problem mit jbuilder zu arbeiten? Sollte ich eine andere ppx-Bibliothek verwenden? Sollte ich ein anderes Build-System verwenden? Wie gehen die meisten OCamler mit solchen Build-System-Problemen um?


bearbeiten: Ich bin mit OCaml Version 4.04.2, jbuilder Version 1.0 + beta11 und ppx_deriving Version 4.1.

+0

Wenn Sie Fragen zu 'jbuilder' stellen, müssen Sie eine' * .opam' Datei hinzufügen. Spricht 'jbuilder' diese Datei an, um herauszufinden, wie die ausführbare Datei erstellt wird? – illabout

+1

Ich habe gerade versucht, 'jbuilder' und' ppx_deriving' zu aktualisieren und jetzt scheint das zu funktionieren. Meine 'jbuilder' Version ist [1.0 + beta12] (https://github.com/janestreet/jbuilder/blob/1c85e646bc732189739e31e697b5e60bbd2221ba/CHANGES.md#10beta12-18082017) und' ppx_deriving' ist Version [4.2] (https: // github.com/ocaml-ppx/ppx_deriving/blob/7969277d1ec02517f441930e449d115d64a2a778/CHANGELOG.md # 42). – illabout

+0

Mit den beiden obigen Paketversionen funktioniert dieser Code auch mit der OCaml-Version '4.05.0'. – illabout

Antwort

3

Wie Sie in den Kommentaren gefunden haben, erfordert dies eine besondere Behandlung in ppx_deriving, die nur in Version 4.2 zusammengeführt wurde.

Der zugrunde liegende Grund ist, dass jbuilderppx_driver verwendet, ppx Rewriter und nicht die -ppx Flag anwenden.

Verwandte Themen