2017-08-28 59 views
3

推导数据类型的to_string方法如何使用ppx和jbuilder推导to_string数据类型的方法?如何使用ppx

例如,我试图用@@deriving show推导出一个数据类型的show_*方法。我有一个简单main.ml文件看起来像这样:

open Core 

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

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

我有一个jbuild文件看起来像这样同一个目录下:

(jbuild_version 1) 

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

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

当我运行jbuilder build,我得到以下错误:

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

好像jbuilder不运行ppx_deriving.show预处理器,并且不会产生次e show_foo功能。

我的使用@@derive show是否正确?我需要添加一些东西到我的jbuild文件,让它正常工作? ppx_deriving在使用jbuilder时出现问题?我应该使用不同的ppx库吗?我应该使用不同的构建系统吗?大多数OCamlers如何处理这些构建系统问题?


编辑:我使用OCaml的版本4.04.2,JBuilder的版本1.0 + beta11和ppx_deriving 4.1版本。

+0

当张贴有关'jbuilder'的问题,既要包括'* .opam'文件? 'jbuilder'看这个文件来弄清楚如何构建可执行文件吗? – illabout

+1

我只是想更新'jbuilder'和'ppx_deriving'现在这似乎工作。我的'jbuilder'版本是[1.0 + beta12](https://github.com/janestreet/jbuilder/blob/1c85e646bc732189739e31e697b5e60bbd2221ba/CHANGES.md#10beta12-18082017)和'ppx_deriving'是版本[4.2](https://开头github.com/ocaml-ppx/ppx_deriving/blob/7969277d1ec02517f441930e449d115d64a2a778/CHANGELOG.md#42)。 – illabout

+0

使用上述两种封装版本,该代码也可以与OCaml的版本'4.05.0'。 – illabout

回答

3

正如你在评论中发现的,这需要ppx_deriving特别处理,这是只有在4.2版本合并。

其根本原因是jbuilder使用ppx_driver来应用ppx重写器而不是-ppx标志。