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

标签 ocaml ppx ocaml-dune

我如何推导 to_string使用带有 jbuilder 的 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预处理器,并且不生成 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旗帜。

关于ocaml - 如何使用 ppx 为数据类型派生 to_string 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45914171/

相关文章:

OCaml 属性

通过我的 PPX 语法扩展转换的 OCaml 代码找不到其他包

OCaml 和沙丘 : Integrate small libraries in a larger library

debugging - 沙丘调试 - OCaml

ocaml - 有没有办法在 OCaml 沙丘中用连字符声明可执行文件?

types - 内置类型上的OCaml模式匹配

compiler-errors - 使用List.fold_left时的错误类型

ocaml - 如何在 ppx_deriving 中使用 jbuild 和 ppx_driver

ocaml - 如何用unit()包装OCaml表达式?

recursion - Ocaml 延续传球风格