如何使用 ppx 为数据类型派生 to_string 方法

how to derive to_string methods for data types using ppx

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

例如,我正在尝试使用 @@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 预处理器,也没有生成 show_foo 函数。

我对 @@derive show 的使用是否正确?我是否需要向我的 jbuild 文件添加一些内容才能使其正常工作? ppx_deriving 使用 jbuilder 有问题吗?我应该使用不同的 ppx 库吗?我应该使用不同的构建系统吗?大多数 OCamlers 如何处理这类构建系统问题?


编辑:我使用的是 OCaml 4.04.2 版,jbuilder 1.0+beta11 版,以及 ppx_deriving 4.1 版。

正如您在评论中发现的那样,这需要在 ppx_deriving 中进行特殊处理,它仅在 4.2 版中合并。

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