【问题标题】:How to handle different OCaml versions when generating AST with ppxlib使用 ppxlib 生成 AST 时如何处理不同的 OCaml 版本
【发布时间】:2022-09-27 20:21:54
【问题描述】:

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

理想情况下,该库可用于某些范围的 OCaml 版本

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

例如,当building a variant type declaration 时,我们必须定义如下记录:

    {
      pcd_name = {txt = name; loc};
      pcd_args = Pcstr_tuple [];
      pcd_res = None;
      pcd_loc = loc;
      pcd_attributes = [];
    }

这是constructor_declaration type

但是,此 AST 类型在 OCaml 4.13OCaml 4.14 之间有所不同

我希望大多数 ppxlib Ast_builder 助手负责为我在编译我的库的任何 OCaml 版本生成正确的 AST 版本。

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

我找到了这个:

utop # Sys.ocaml_version;;
- : string = \"4.12.1\"

所以大概我应该把这个字符串解析成int * int * int,这样我就可以对4.14.0之后的版本进行安全比较

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

    标签: ocaml ppx


    【解决方案1】:

    图书馆ocaml-migrate-parsetree 正是这样做的。

    来自 opam 简介:

    这个库在解析树、结果树和 ast 映射器之间转换 不同的 OCaml 版本。高级功能有助于制作 PPX 独立于编译器版本的重写器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 2020-05-19
      相关资源
      最近更新 更多