使用 ppxlib 生成 AST 时如何处理不同的 OCaml 版本

Ane*_*pic 5 ocaml ppx

我正在制作一个 ppx 扩展重写器作为代码库的一部分

理想情况下,该库可与某些 OCaml 版本一起使用

我注意到,当构建 AST 节点以从我的重写器输出时,不可避免地必须构造一些记录,其结构特定于特定的 OCaml AST 版本

例如,在构建变体类型声明时,我们必须定义如下记录:

    {
      pcd_name = {txt = name; loc};
      pcd_args = Pcstr_tuple [];
      pcd_res = None;
      pcd_loc = loc;
      pcd_attributes = [];
    }
Run Code Online (Sandbox Code Playgroud)

是哪一种constructor_declaration类型

然而,这种 AST 类型在OCaml 4.13OCaml 4.14之间有所不同

我希望大多数 ppxlibAst_builder帮助程序能够为我正在编译库的任何 OCaml 版本生成正确的 AST 版本。

但在我必须手动定义这些记录实例之一的地方,我可能需要检测当前的 OCaml 版本并以这种方式返回正确的记录格式?

我找到了这个:

utop # Sys.ocaml_version;;
- : string = "4.12.1"
Run Code Online (Sandbox Code Playgroud)

所以想必我应该解析这个字符串,int * int * int以便我可以对 4.14.0 之后的版本进行安全比较

有没有更好的方法,或者我应该做一些不同的事情?

oct*_*ron 1

ppxlib 的真正目的是独立于编译器版本编写 ppx。如果您最终匹配编译器版本,则您正在重复 ppxlib 所做的工作。

Ppxlib 的工作原理是使用内部参考 AST 并在此参考 AST 和 OCaml AST 的各个版本之间进行迁移。理论上,您可以手动编写与参考 AST 相对应的 AST 节点,但这非常脆弱。这就是为什么 ppxlib 提供了两个与版本无关的路径来构建 AST 节点,并且所有这些路径都会生成适用于 ppxlib 支持的编译器的所有版本的 ppx:

  • 提供的引用语法ppx.metaquot
  • Ast_builder模块中的构造函数

如果您发现需要手动编写 AST 节点的极端情况,这是 ppxlib 中的错误,您应该报告。